1. 程式人生 > >自定義BaseDialog,繼承BaseDialog實現自己想要的功能。

自定義BaseDialog,繼承BaseDialog實現自己想要的功能。

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;
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 interface
OnBaseDialogListener { 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(); } }
2.寫我們自定義的dialog,首先我們需要繼承BaseDialog,然後有自己的佈局檔案,還有自己的dialog樣式,在這裡我寫了三個建構函式,根據自己的需要是否自定義標題輸入文字之類的自己選擇。同樣繼承父類的想對應方法;getDialogStyleId():獲取自定義dialog樣式;getView()獲取自定義layout佈局檔案;還有就是簡單的載入自定義文字方法。

如下程式碼:

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,那麼到這裡呢,我們的文章就已經結束了,歡迎你的關注,如有什麼疑問,可以直接回復我,我會在最快的時間回覆你。