Android中Dialog自定義上下文花式菜單
這是一個類似于QQ里面長按消息彈出菜單的效果,菜單跟著item動
閑話不說,上代碼
先自定義一個Dialog
import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.TextView; import io.dcloud.H5B79C397.R; /** * Created by Administrator on 2017/9/19 0019. */ public class SelfDialog extends Dialog { private TextView copy;//確定按鈕 private TextView del;//取消按鈕 private onNoOnclickListener noOnclickListener;//取消按鈕被點(diǎn)擊了的監(jiān)聽器 private onYesOnclickListener yesOnclickListener;//確定按鈕被點(diǎn)擊了的監(jiān)聽器 public SelfDialog(Context context) { super(context, R.style.MyDialog); } public void setNoOnclickListener(String str, onNoOnclickListener onNoOnclickListener) { if (str != null) { //noStr = str; } this.noOnclickListener = onNoOnclickListener; } public void setYesOnclickListener(String str, onYesOnclickListener onYesOnclickListener) { if (str != null) { //yesStr = str; } this.yesOnclickListener = onYesOnclickListener; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_noticeactivity_dialog); //按空白處不能取消動畫 setCanceledOnTouchOutside(true); //初始化界面控件 initView(); //初始化界面數(shù)據(jù) //初始化界面控件的事件 initEvent(); } private void initEvent() { //設(shè)置確定按鈕被點(diǎn)擊后,向外界提供監(jiān)聽 del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (yesOnclickListener != null) { yesOnclickListener.onYesClick(); } } }); //設(shè)置取消按鈕被點(diǎn)擊后,向外界提供監(jiān)聽 copy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (noOnclickListener != null) { noOnclickListener.onNoClick(); } } }); } private void initView() { del = (TextView) findViewById(R.id.del); copy = (TextView) findViewById(R.id.text); } public interface onYesOnclickListener { public void onYesClick(); } public interface onNoOnclickListener { public void onNoClick(); } }
然后看Dialog里面的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:text="復(fù)制" android:clickable="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text" android:drawableTop="@mipmap/collect"/> <TextView android:layout_marginLeft="15dp" android:clickable="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="刪除" android:id="@+id/del" android:drawableTop="@mipmap/myself"/> </LinearLayout>
還給Dialog設(shè)置了一個樣式
<style name="MyDialog" parent="android:style/Theme.Dialog"> <!--背景顏色及和透明程度--> <item name="android:windowBackground">@android:color/transparent</item> <!--是否去除標(biāo)題 --> <item name="android:windowNoTitle">true</item> <!--是否去除邊框--> <item name="android:windowFrame">@null</item> <!--是否浮現(xiàn)在activity之上--> <item name="android:windowIsFloating">true</item> <!--是否模糊--> <item name="android:backgroundDimEnabled">false</item> </style>
然后看主代碼
public class MenuTestActivity extends Activity { private ListView listView; private SelfDialog selfDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu_test); listView = (ListView) findViewById(R.id.list); final ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuTestActivity.this, android.R.layout.simple_list_item_1); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); adapter.add("1"); listView.setAdapter(adapter); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, long id) { int[] location = new int[2]; // parent.getItemAtPosition(position).getLocationOnScreen(location); view.getLocationOnScreen(location);//當(dāng)前item的坐標(biāo) int x = location[0]; int y = location[1]; System.out.println("x:"+x+"y:"+y);//獲取控件位置坐標(biāo)可采用以上方法 selfDialog = new SelfDialog(MenuTestActivity.this); // Window window = selfDialog.getWindow(); // window.setContentView(view); Window dialogWindow = selfDialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP); lp.x = location[0]+80; // 新位置X坐標(biāo) lp.y = location[1]-30; // 新位置Y坐標(biāo) // 當(dāng)Window的Attributes改變時系統(tǒng)會調(diào)用此函數(shù),可以直接調(diào)用以應(yīng)用上面對窗口參數(shù)的更改,也可以用setAttributes // dialog.onWindowAttributesChanged(lp); dialogWindow.setAttributes(lp); selfDialog.setCanceledOnTouchOutside(true);// 設(shè)置點(diǎn)擊屏幕Dialog不消失 selfDialog.setYesOnclickListener("確定", new SelfDialog.onYesOnclickListener() { @Override public void onYesClick() { Toast.makeText(MenuTestActivity.this, adapter.getItem(position), Toast.LENGTH_LONG).show(); selfDialog.dismiss(); } }); selfDialog.setNoOnclickListener("取消", new SelfDialog.onNoOnclickListener() { @Override public void onNoClick() { Toast.makeText(MenuTestActivity.this, adapter.getItem(position), Toast.LENGTH_LONG).show(); selfDialog.dismiss(); } }); selfDialog.show(); return true; } }); } }
主程序的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="io.dcloud.H5B79C397.testActivity.MenuTestActivity"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/list"></ListView> </LinearLayout>
效果圖:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android左右滑出菜單實(shí)例分析
- android底部菜單欄實(shí)現(xiàn)原理與代碼
- android popwindow實(shí)現(xiàn)左側(cè)彈出菜單層及PopupWindow主要方法介紹
- 基于Android實(shí)現(xiàn)點(diǎn)擊某個按鈕讓菜單選項(xiàng)從按鈕周圍指定位置彈出
- Android ListView長按彈出菜單二種實(shí)現(xiàn)方式示例
- Android界面設(shè)計(jì)(APP設(shè)計(jì)趨勢 左側(cè)隱藏菜單右邊顯示content)
- Android開發(fā)技巧之我的菜單我做主(自定義菜單)
- Android仿QQ空間底部菜單示例代碼
- Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
- Android實(shí)現(xiàn)原生側(cè)滑菜單的超簡單方式
相關(guān)文章
Android自定義View仿QQ等級天數(shù)進(jìn)度
這篇文章主要為大家詳細(xì)介紹了Android自定義View仿QQ等級天數(shù)進(jìn)度效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07Android自定義視圖實(shí)現(xiàn)手指移動軌跡
這篇文章主要為大家詳細(xì)介紹了Android自定義視圖實(shí)現(xiàn)手指移動軌跡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Android AlertDialog自定義樣式實(shí)現(xiàn)代碼
這篇文章主要介紹了Android AlertDialog自定義樣式實(shí)現(xiàn)代碼的相關(guān)資料,這里提供了實(shí)例代碼,一個簡單示例,需要的朋友可以參考下2016-12-12Android ServiceManager的啟動和工作原理
這篇文章主要介紹了Android ServiceManager的啟動和工作原理,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-03-03Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法
這篇文章主要介紹了Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法,涉及Android針對文件與目錄的遍歷及I/O操作相關(guān)技巧,需要的朋友可以參考下2016-02-02Android中RecyclerView拖拽、側(cè)刪功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中RecyclerView拖拽、側(cè)刪功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-09-09Android自定義View實(shí)現(xiàn)繪制水波浪溫度刻度表
這篇文章主要為大家詳細(xì)介紹了Android如何利用自定義View實(shí)現(xiàn)一個水波浪溫度刻度表,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11Android高手進(jìn)階教程(二十六)之---Android超仿Path菜單的功能實(shí)現(xiàn)!
本篇文章主要主要介紹了Android超仿Path菜單的功能實(shí)現(xiàn),現(xiàn)在分享給大家,也給大家做個參考。感興趣的可以了解一下。2016-11-11