Android開發-自定義Dialog
阿新 • • 發佈:2018-11-10
下面是效果圖
定義一個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();