1. 程式人生 > >Android開發-自定義Dialog

Android開發-自定義Dialog

下面是效果圖

定義一個MyDialog.java工具類繼承Dialog類

具體程式碼如下:

/**
 * Created by WW on 2018/9/12.
 */
public abstract class MyDialog extends Dialog{
    private Button yesBtn,noBtn;//確定按鈕、取消按鈕
    private TextView title,message;//標題控制元件、內容控制元件
    private String titleStr,messageStr;//標題文字、訊息文字
    private EditText payEt;//支付輸入框

    //構造方法
    public MyDialog(Context context) {
        //應用上下文,傳入自定義的style
        //此處也可以不傳如自定義的R.style.MyDialog
        super(context, R.style.MyDialog);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設定自定義的Dialog佈局
        setContentView(R.layout.mydialog_layout);

        //點選空白處不能關閉Dialog
        setCanceledOnTouchOutside(false);

        //初始化資料
        init();

        //初始化控制元件
        initData();

        //初始化事件
        initEvent();
    }

    //初始化資料
    private void initData() {
        if (titleStr != null) {
            title.setText(titleStr);
        }
        if (messageStr != null) {
            message.setText(messageStr);
        }
    }

    //初始化控制元件
    private void init() {
        yesBtn = findViewById(R.id.yesBtn);
        noBtn = findViewById(R.id.noBtn);
        title = findViewById(R.id.title);
        message = findViewById(R.id.message);
        payEt = findViewById(R.id.payEt);
    }

    //設定標題文字
    public void setTitleStr(String titleStr)
    {
        this.titleStr = titleStr;
    }

    //設定訊息內容
    public void setMessageStr(String messageStr)
    {
        this.messageStr = messageStr;
    }

    //獲得支付輸入框的內容
    public String getPayEt()
    {
        return payEt.getText().toString();
    }

    //初始化事件
    public void initEvent(){
        //為按鈕繫結點選事件,執行下面的抽象方法(由呼叫者實現邏輯程式碼)
        yesBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                YesOnClickListener();
            }
        });
        noBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                NoOnClickListener();
            }
        });
    }

    //確定按鈕的抽象方法
    public abstract void YesOnClickListener();
    //取消按鈕的抽象方法
    public abstract void NoOnClickListener();
}

自定義Dialog風格

<style name="MyDialog" parent="android:style/Theme.Dialog">
        <!--背景顏色和透明度-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--是否模糊-->
        <item name="android:backgroundDimEnabled">false</item>
    </style>

可以不在MyDialog類中傳入自定義的R.style.MyDialog,如果不傳入自定義的style,則自動使用預設style

預設style效果:

以及一個佈局檔案,用來作為自定義Dialog的佈局

mydialog_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="260dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/mydialog_style">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="標題"
            android:padding="5dp"
            android:layout_gravity="center"
            android:id="@+id/title"
            android:textColor="#ff0036"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="內容提示資訊"
            android:padding="5dp"
            android:id="@+id/message"
            android:layout_gravity="center"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="45dp">
            <EditText
                android:layout_width="200dp"
                android:layout_height="35dp"
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true"
                android:id="@+id/payEt"
                android:background="#ffffff"
                android:textAlignment="center"/>
        </RelativeLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#e3e3e3"></View>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:orientation="horizontal">
            <Button
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:text="確定"
                android:id="@+id/yesBtn"
                android:layout_weight="1"
                android:background="#ff0036"
                android:textColor="#ffffff"/>
            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="#e3e3e3"></View>
            <Button
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:text="取消"
                android:id="@+id/noBtn"
                android:layout_weight="1"
                android:background="#ffffff"
                android:textColor="#000000"/>
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

新建一個Activity,MyDialogActivity.java

MyDialogActivity.java程式碼:

public class MyDialogActivity extends Activity {
    Button mydialog;
    MyDialog myDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_dialog);
        mydialog = findViewById(R.id.mydialog);
        mydialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myDialog = new MyDialog(MyDialogActivity.this) {
                    @Override
                    public void YesOnClickListener() {
                        if(myDialog.getPayEt().equals("123"))
                            Toast.makeText(MyDialogActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        else
                            Toast.makeText(MyDialogActivity.this, "支付密碼錯誤", Toast.LENGTH_SHORT).show();
                        myDialog.dismiss();
                    }

                    @Override
                    public void NoOnClickListener() {
                        Toast.makeText(MyDialogActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
                        myDialog.dismiss();
                    }
                };
                myDialog.setTitleStr("支付提示");
                myDialog.setMessageStr("輸入支付密碼");
                myDialog.show();
            }
        });
    }
}

Activity的佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="com.example.androidstudy.MyDialogActivity"
    android:background="#e3e3e3">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/mydialog"
        android:text="MyDialog"/>
</RelativeLayout>

除了上面使用抽象方法的方式實現按鈕點選外,還可以通過使用介面的方式

對外暴露點選事件的介面,由呼叫者實現邏輯程式碼

/**
 * Created by WW on 2018/9/12.
 */
public class MyDialog extends Dialog{
    private Button yesBtn,noBtn;//確定按鈕、取消按鈕
    private TextView title,message;//標題控制元件、內容控制元件
    private String titleStr,messageStr;//標題文字、訊息文字
    private EditText payEt;//支付輸入框

    YesOnClickListener yesOnClickListener;//確定介面
    NoOnClickListener noOnClickListener;//取消介面

    //構造方法
    public MyDialog(Context context) {
        //應用上下文,傳入自定義的style
        //此處也可以不傳如自定義的R.style.MyDialog
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設定自定義的Dialog佈局
        setContentView(R.layout.mydialog_layout);

        //點選空白處不能關閉Dialog
        setCanceledOnTouchOutside(false);

        //初始化資料
        init();

        //初始化控制元件
        initData();

        //初始化事件
        initEvent();
    }

    //初始化資料
    private void initData() {
        if (titleStr != null) {
            title.setText(titleStr);
        }
        if (messageStr != null) {
            message.setText(messageStr);
        }
    }

    //初始化控制元件
    private void init() {
        yesBtn = findViewById(R.id.yesBtn);
        noBtn = findViewById(R.id.noBtn);
        title = findViewById(R.id.title);
        message = findViewById(R.id.message);
        payEt = findViewById(R.id.payEt);
    }

    //設定標題文字
    public void setTitleStr(String titleStr)
    {
        this.titleStr = titleStr;
    }

    //設定訊息內容
    public void setMessageStr(String messageStr)
    {
        this.messageStr = messageStr;
    }

    //獲得支付輸入框的內容
    public String getPayEt()
    {
        return payEt.getText().toString();
    }

    //實現YesOnClickListener介面方法,傳入YesOnClickListener
    public void setYesOnClick(YesOnClickListener yesOnClickListener)
    {
        this.yesOnClickListener = yesOnClickListener;
    }

    //實現NoOnClickListener介面方法,傳入NoOnClickListener
    public void setNoOnClick(NoOnClickListener noOnClickListener)
    {
        this.noOnClickListener = noOnClickListener;
    }

    private void initEvent() {
        //設定確定按鈕被點選後,向外界提供監聽
        yesBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (yesOnClickListener!=null)
                    yesOnClickListener.onYesClick();
            }
        });
        //設定取消按鈕被點選後,向外界提供監聽
        noBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (noOnClickListener!=null)
                    noOnClickListener.onNoClick();
            }
        });
    }

    //確定按鈕介面
    public interface YesOnClickListener {
        public void onYesClick();
    }

    //取消按鈕介面
    public interface NoOnClickListener {
        public void onNoClick();
    }
}

呼叫MyDialog:

MyDialog myDialog;
myDialog = new MyDialog(MyDialogActivity.this);
                myDialog.setTitleStr("支付提示");
                myDialog.setMessageStr("輸入支付密碼");
                myDialog.setYesOnClick(new MyDialog.YesOnClickListener() {
                    @Override
                    public void onYesClick() {
                        Toast.makeText(MyDialogActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        myDialog.dismiss();
                    }
                });
                myDialog.setNoOnClick(new MyDialog.NoOnClickListener() {
                    @Override
                    public void onNoClick() {
                        Toast.makeText(MyDialogActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
                        myDialog.dismiss();
                    }
                });
                myDialog.show();