国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 自定義dialog的實(shí)現(xiàn)代碼

2019-10-23 18:34:15
字體:
供稿:網(wǎng)友

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:

Android,自定義dialog,自定義dialog詳解及實(shí)例

Android,自定義dialog,自定義dialog詳解及實(shí)例

允許添加子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è)置對話框彈出背景,嘗試設(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;  /**  * 自定義對話框  *  * @author Kangwei  *  */ public class MyDialog extends Dialog {    /* 屬性 */    // 數(shù)據(jù)   String  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è)置對話框樣式,設(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è)置對話框大小     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;    /**    * 對話框按鈕監(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;    /**    * 在對話框顯示自定義視圖    */   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(); } 
/*    * 顯示配置對話框    */   private void showConfigDialog() {     // 讀取參數(shù)     final SharedPreferencesHelper helper = new SharedPreferencesHelper(         this, "config");     final String ip = helper.getValue("serverip");     final String port = helper.getValue("serverport");      // 配置界面 輸入IP和端口的簡單界面,這里就不附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()));      // 配置對話框     MyDialog dialog = new MyDialog(this, "參數(shù)配置", null, "取消", "確定");     // 添加配置界面到對話框     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();   } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤山市| 嘉荫县| 当涂县| 山丹县| 恩施市| 平潭县| 苏尼特左旗| 北流市| 区。| 斗六市| 阳江市| 泊头市| 乌拉特前旗| 木兰县| 根河市| 张家川| 巨野县| 马鞍山市| 仁寿县| 苍山县| 瓦房店市| 盐池县| 黄梅县| 沂水县| 天柱县| 靖宇县| 江山市| 东方市| 江孜县| 枣强县| 油尖旺区| 手游| 治县。| 黑龙江省| 盘锦市| 邮箱| 乾安县| 丽水市| 孟州市| 鄂州市| 黔江区|