Android 自定義dialog的實(shí)現(xiàn)代碼
Android 自定義dialog的實(shí)現(xiàn)代碼
搜索相關(guān)關(guān)鍵字網(wǎng)上一大堆實(shí)現(xiàn),但是看完總覺得缺胳膊少腿,繞了不少彎路,終于弄好了自定義dialog。把自己整合的完整代碼發(fā)上來。
要點(diǎn):
1、設(shè)置自定義dialog的布局文件my_dialog.xml
2、設(shè)置一份自定義的樣式文件styles_wx.xml,該文件用于覆蓋Android的默認(rèn)主題樣式,如黑色邊框等。
3、Java代碼繼承Dialog實(shí)現(xiàn)自定義類MyDialog,實(shí)現(xiàn)自定義布局,還有設(shè)置窗口的大小、位置等。
(網(wǎng)上文章要么少介紹第2點(diǎn),要么是使用AlterDialog直接實(shí)現(xiàn)效果)
先看下效果,模仿微信風(fēng)格的dialog:
允許添加子view到彈出dialog,如:
代碼。
Part1.styles_wx.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 微信彈窗 --> <style name="wx_dialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <!-- 邊框 --> <item name="android:windowIsFloating">true</item> <!-- 是否浮現(xiàn)在activity之上 --> <item name="android:windowIsTranslucent">false</item> <!-- 半透明 --> <item name="android:windowNoTitle">true</item> <!-- 無標(biāo)題 --> <item name="android:windowBackground">@drawable/transparent</item> <!-- 自己想要的背景 --> <item name="android:backgroundDimEnabled">true</item> <!-- 背景內(nèi)容模糊 --> </style> </resources>
注意,此處:
<item name="android:windowBackground">@drawable/transparent</item>
這是設(shè)置對(duì)話框彈出背景,嘗試設(shè)置@null,仍然是黑色背景,在使用半透明圖片時(shí)會(huì)受其影響。
所以,可以在這里指定你想要的背景圖片或者顏色。
我為了靈活性,我設(shè)置該屬性為名為"transparent"的圖片,這是一張1*1的透明圖片。這樣背景完全透明,真正使用的背景在my_dialog.xml里定義
Part2.my_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/frame_white" android:orientation="vertical" android:padding="15dp" > <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/systitle" android:textSize="18sp" /> <!-- 分隔符用 --> <TextView android:id="@+id/tvSeparator" style="@style/TextViewAsSeparator" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" /> <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sysText" android:textSize="18sp" /> <!-- 該RelativeLayout作為子視圖容器 --> <RelativeLayout android:id="@+id/rlContent" android:layout_width="match_parent" android:layout_height="wrap_content" > </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:orientation="horizontal" > <TextView android:id="@+id/tvButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginLeft="10dp" android:background="@drawable/selector_text_button" android:clickable="true" android:paddingBottom="5dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="5dp" android:text="@string/ok" android:textColor="@color/wx_text_link" android:textSize="14sp" android:visibility="visible" /> <TextView android:id="@+id/tvButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="true" android:layout_marginLeft="10dp" android:layout_toLeftOf="@id/tvButton2" android:background="@drawable/selector_text_button" android:clickable="true" android:paddingBottom="5dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="5dp" android:text="@string/cancel" android:textColor="@color/wx_text_link" android:textSize="14sp" /> </RelativeLayout> </LinearLayout>
Part3.MyDialog.java
package com.kwws; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.RelativeLayout; import android.widget.TextView; import com.navigator.R; /** * 自定義對(duì)話框 * * @author Kangwei * */ public class MyDialog extends Dialog { /* 屬性 */ // 數(shù)據(jù) String title = "title"; String text = "text"; String cancelButtonText = "cancel"; String okButtonText = "ok"; int okColor = -1; int cancelColor = -1; // UI Context mContent; TextView tvTitle; TextView tvSeparator; TextView tvText; TextView tvBtn1; TextView tvBtn2; RelativeLayout childViewWrapper;// 子組件容器 /** * 設(shè)置對(duì)話框樣式,設(shè)置null則不顯示 * * @param context * 上下文 * @param title * 標(biāo)題 * @param text * 文本 * @param cancelButtonText * 取消按鈕文本 * @param okButtonText * 確認(rèn)按鈕文本 */ public MyDialog(Context context, String title, String text, String cancelButtonText, String okButtonText) { super(context, R.style.wx_dialog);// 樣式定義,該樣式去除android默認(rèn)的黑色背景邊框等。 this.mContent = context; setDialogStyle(title, text, cancelButtonText, okButtonText); } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); LayoutInflater layout = LayoutInflater.from(mContent); View view = layout.inflate(R.layout.my_dialog, null); setContentView(view); findView(); initView(); initViewEvent(); } private void setDialogStyle(String title, String text, String cancelButtonText, String okButtonText) { this.title = title; this.text = text; this.cancelButtonText = cancelButtonText; this.okButtonText = okButtonText; } private void findView() { tvTitle = (TextView) findViewById(R.id.tvTitle); tvSeparator = (TextView) findViewById(R.id.tvSeparator); tvText = (TextView) findViewById(R.id.tvText); tvBtn1 = (TextView) findViewById(R.id.tvButton1); tvBtn2 = (TextView) findViewById(R.id.tvButton2); childViewWrapper = (RelativeLayout) findViewById(R.id.rlContent); } private void initView() { if (title == null) { tvTitle.setVisibility(View.GONE); tvSeparator.setVisibility(View.GONE); } else { tvTitle.setVisibility(View.VISIBLE); tvSeparator.setVisibility(View.VISIBLE); tvTitle.setText(title); } if (text == null) { tvText.setVisibility(View.GONE); } else { tvText.setVisibility(View.VISIBLE); tvText.setText(text); } if (cancelButtonText == null) { tvBtn1.setVisibility(View.GONE); } else { tvBtn1.setVisibility(View.VISIBLE); tvBtn1.setText(cancelButtonText); if (cancelColor != -1) { tvBtn1.setTextColor(cancelColor); } } if (okButtonText == null) { tvBtn2.setVisibility(View.GONE); } else { tvBtn2.setVisibility(View.VISIBLE); tvBtn2.setText(okButtonText); if (okColor != -1) { tvBtn2.setTextColor(okColor); } } if (childViewWrapper != null && childView != null) { childViewWrapper.addView(childView); } // 設(shè)置對(duì)話框大小 Window dialogWindow = getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); DisplayMetrics d = mContent.getResources().getDisplayMetrics(); // 獲取屏幕寬、高用 lp.width = (int) (d.widthPixels * 0.8); // 高度設(shè)置為屏幕的0.8 dialogWindow.setAttributes(lp); } private void initViewEvent() { View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.tvButton1: if (mListener != null) { mListener.onCancelButtonClick(MyDialog.this, v); } break; case R.id.tvButton2: if (mListener != null) { mListener.onOKButtonClick(MyDialog.this, v); } break; default: break; } } }; tvBtn1.setOnClickListener(listener); tvBtn2.setOnClickListener(listener); } public interface OnDialogButtonClickListener { void onCancelButtonClick(MyDialog dialog, View view); void onOKButtonClick(MyDialog dialog, View view); } private OnDialogButtonClickListener mListener; /** * 對(duì)話框按鈕監(jiān)聽 * * @param listener */ public void setOnDialogButtonClickListener( OnDialogButtonClickListener listener) { this.mListener = listener; } /** * 確定按鈕文本顏色 * * @param color */ public void setOKButtonTextColor(int color) { this.okColor = color; } /** * 取消按鈕文本顏色 * * @param color */ public void setCancelButtonTextColor(int color) { this.cancelColor = color; } View childView; /** * 在對(duì)話框顯示自定義視圖 */ public void setChildView(View view) { childView = view; } }
Part4.使用
// 退出提示框 public void exitDialog() { MyDialog dialog = new MyDialog(this, "提示", "確認(rèn)退出?", "取消", "退出"); dialog.setOKButtonTextColor(getResources().getColor(R.color.red)); dialog.setOnDialogButtonClickListener(new OnDialogButtonClickListener() { @Override public void onOKButtonClick(MyDialog dialog, View view) { finish(); } @Override public void onCancelButtonClick(MyDialog dialog, View view) { dialog.dismiss(); } }); dialog.show(); }
/* * 顯示配置對(duì)話框 */ private void showConfigDialog() { // 讀取參數(shù) final SharedPreferencesHelper helper = new SharedPreferencesHelper( this, "config"); final String ip = helper.getValue("serverip"); final String port = helper.getValue("serverport"); // 配置界面 輸入IP和端口的簡(jiǎn)單界面,這里就不附xml了 View view = getLayoutInflater().inflate(R.layout.dialog_config, null); final EditText etIP = (EditText) view.findViewById(R.id.etIP); final EditText etPort = (EditText) view.findViewById(R.id.etPort); etIP.setText(ip != null ? ip : Ksoap2Helper.getServerIP()); etPort.setText(port != null ? port : String.valueOf(Ksoap2Helper .getServerPort())); // 配置對(duì)話框 MyDialog dialog = new MyDialog(this, "參數(shù)配置", null, "取消", "確定"); // 添加配置界面到對(duì)話框 dialog.setChildView(view); // 按鈕監(jiān)聽 dialog.setOnDialogButtonClickListener(new OnDialogButtonClickListener() { @Override public void onOKButtonClick(MyDialog dialog, View view) { // 保存配置 String newIP = etIP.getText().toString(); String newPort = etPort.getText().toString(); if (true) { helper.putValue("serverip", newIP); Ksoap2Helper.setServerIP(newIP); } if (true) { helper.putValue("serverport", newPort); Ksoap2Helper.setServerPort(Integer.valueOf(newPort)); } dialog.dismiss(); } @Override public void onCancelButtonClick(MyDialog dialog, View view) { dialog.dismiss(); } }); dialog.show(); }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置實(shí)例代碼
本篇文章主要介紹了Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android?獲取手機(jī)已安裝的應(yīng)用列表實(shí)現(xiàn)詳解
這篇文章主要介紹了Android?獲取手機(jī)已安裝的應(yīng)用列表的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android 自動(dòng)判斷是電話,網(wǎng)址,EMAIL方法之Linkify的使用
本篇文章小編為大家介紹,在Android中 自動(dòng)判斷是電話,網(wǎng)址,EMAIL方法之Linkify的使用。需要的朋友參考下2013-04-04Android 7.0 SEAndroid app權(quán)限配置方法
今天小編就為大家分享一篇Android 7.0 SEAndroid app權(quán)限配置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Kotlin實(shí)現(xiàn)多函數(shù)接口的簡(jiǎn)化調(diào)用
這篇文章主要為大家詳細(xì)介紹了Kotlin實(shí)現(xiàn)多函數(shù)接口的簡(jiǎn)化調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06