自定義BaseDialog,繼承BaseDialog實現自己想要的功能。
阿新 • • 發佈:2019-01-29
1.首先介紹我們的baseDialog,自定義常用的監聽方法positive、negative。以及建構函式,自定義了兩個建構函式,根據自己的需要是否新增監聽事件實現dialog方法,getDialogStyleId方法是載入自定義dialog樣式,在style檔案中載入寫入。
見如下程式碼:
import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.view.Display; import android.view.View;2.寫我們自定義的dialog,首先我們需要繼承BaseDialog,然後有自己的佈局檔案,還有自己的dialog樣式,在這裡我寫了三個建構函式,根據自己的需要是否自定義標題輸入文字之類的自己選擇。同樣繼承父類的想對應方法;getDialogStyleId():獲取自定義dialog樣式;getView()獲取自定義layout佈局檔案;還有就是簡單的載入自定義文字方法。import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; /** * Created by JackZheng on 16/11/9. */ public abstract class BaseDialog { public OnBaseDialogListener baseDialogListener; //定義回撥事件,用於dialog的點選事件 public interfaceOnBaseDialogListener { void positive(); void negative(); } //這些屬性,Context 是肯定要的,基本對話方塊要用它 protected Context context; private Display display;//這個設定顯示屬性用的 private Dialog dialog;//自定義Dialog,Dialog還是要有一個的吧 //對話方塊佈局的樣式ID (通過這個抽象方法,我們可以給不同的對話方塊設定不同樣式主題) protected abstract int getDialogStyleId(); //構建對話方塊的方法(都說了是不同的對話方塊,佈局什麼的肯定是不一樣的) protected abstract View getView(); //構造方法 來實現 最基本的對話方塊 public BaseDialog(Context context) { this.context = context; initView(); } public BaseDialog(Context context, OnBaseDialogListener baseDialogListener) { this.baseDialogListener = baseDialogListener; this.context = context; initView(); } /** * 初始化 檢視 */ private void initView() { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); display = windowManager.getDefaultDisplay(); //在這裡初始化 基礎對話方塊s if (getDialogStyleId() == 0) { dialog = new Dialog(context, Dialog.BUTTON_POSITIVE); } else { dialog = new Dialog(context, getDialogStyleId()); } View view = getView(); // 調整dialog背景大小 view.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); dialog.addContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); //dialog.getWindow().setLayout(600, 400);//設定 寬高 dialog.setContentView(view); } /** * Dialog 的基礎方法, 凡是要用的就在這寫出來,然後直接用對話方塊調本來的方法就好了,不夠自己加~hhh * 像這類設定對話方塊屬性的方法,就返回值寫自己,這樣就可以一條鏈式設定了 */ public BaseDialog setCancelable(boolean cancel) { dialog.setCancelable(cancel); return this; } public void show() { dialog.show(); } public void dismiss() { if (isShowing()) dialog.dismiss(); } public boolean isShowing() { return dialog.isShowing(); } }
如下程式碼:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.sudiyi.apps.xiaoht.R; import com.sudiyi.apps.xiaoht.base.BaseDialog; /** * Created by JackZheng on 16/11/9. * 載入 dialog */ public class SureOrCancelDialog extends BaseDialog { private TextView mTvCancel;//取消 private TextView mTvSure;//確定 private TextView mTvTitle;//標題 public SureOrCancelDialog(Context context) { super(context); } public SureOrCancelDialog(Context context, OnBaseDialogListener onBaseDialogListener) { super(context, onBaseDialogListener); } /** * @param context 上下文 * @param onBaseDialogListener 回撥監聽 * @param cancelName 自定義取消名字 * @param sureName 自定義確定名字 * @param title 自定義title */ public SureOrCancelDialog(Context context, OnBaseDialogListener onBaseDialogListener, String title, String cancelName, String sureName) { super(context, onBaseDialogListener); setCancelName(cancelName); setSureName(sureName); setTitleName(title); } //設定對話方塊的樣式 @Override protected int getDialogStyleId() { return R.style.Dialog; } //繼承於BaseDialog的方法,設定佈局用的,這樣對話方塊張啥樣久隨心所欲啦 @Override protected View getView() { // 獲取Dialog佈局 View view = LayoutInflater.from(context).inflate(R.layout.sure_or_cancel_dialog, null); //得到各種 mTvCancel = (TextView) view.findViewById(R.id.tv_cancel); mTvSure = (TextView) view.findViewById(R.id.tv_sure); mTvTitle = (TextView) view.findViewById(R.id.tv_title); if (baseDialogListener != null) { mTvCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { baseDialogListener.negative(); dismiss(); } }); mTvSure.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { baseDialogListener.positive(); dismiss(); } }); } return view; } /** * 設定取消名字 * * @param string * @return */ public BaseDialog setCancelName(String string) { mTvCancel.setText(string); return this; } /** * 設定確定名字 * * @param string * @return */ public BaseDialog setSureName(String string) { mTvSure.setText(string); return this; } /** * 設定標題名字 * * @param string * @return */ public BaseDialog setTitleName(String string) { mTvTitle.setText(string); return this; } }3.最後貼上我自己使用的dialog的style
<!--自定義dialog 樣式--> <style name="Dialog" parent="android:style/Theme.Dialog"> <item name="android:background">#00000000</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:windowCloseOnTouchOutside">false</item><!--點選螢幕是否消失-->
4.附上我自己自定義的佈局檔案sure_or_cancel_dialog
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/bg_dialog" android:orientation="vertical"> <LinearLayout android:layout_width="260dp" android:layout_height="140dp" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="4" android:gravity="center" android:textColor="@color/black" android:textSize="@dimen/text_size_middle" android:textStyle="bold" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/divider" /> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" android:orientation="horizontal"> <TextView android:id="@+id/tv_cancel" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/sel_dialog_pressed" android:gravity="center" android:textColor="@color/color_cancel" android:textSize="@dimen/text_size_upper_middle" android:textStyle="bold" /> <View android:layout_width="0.5dp" android:layout_height="match_parent" android:background="@color/divider" /> <TextView android:id="@+id/tv_sure" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/sel_dialog_pressed" android:gravity="center" android:textColor="@color/color_sure" android:textSize="@dimen/text_size_upper_middle" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </LinearLayout>5.呼叫方法如下
SureOrCancelDialog deleteAddressTwoDialog = new SureOrCancelDialog(SearchActivity.this, new BaseDialog.OnBaseDialogListener() { @Override public void positive() { } @Override public void negative() { } }, "確認將這個常用地址刪除?", "取消", "確定");deleteAddressTwoDialog.setCancelable(true).show();
6.效果圖如下:
ok,那麼到這裡呢,我們的文章就已經結束了,歡迎你的關注,如有什麼疑問,可以直接回復我,我會在最快的時間回覆你。