Android開發中經常需要使用彈窗來提示用戶或展示一些信息。Android提供了一些基本的彈窗,如AlertDialog和Toast。然而,當我們需要自定義彈窗時,這些基本彈窗就不能滿足開發需求。本文將基於自定義彈窗的基礎,通過功能擴展來進一步豐富彈窗的功能,提高用戶體驗和開發效率。
一、自定義彈窗基礎
自定義彈窗通常由布局文件、彈窗類和調用代碼三部分組成。
1、布局文件
我們可以在res/layout目錄下創建XML布局文件,設置彈窗的外觀、控制項和事件響應等。例如,下面的示例布局文件設置了一個包含TextView和Button的彈窗:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_dialog_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorPrimary"
android:text="彈窗標題" />
<TextView
android:id="@+id/dialog_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="彈窗消息" />
<Button
android:id="@+id/dialog_button_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消"
android:textColor="@color/colorPrimary" />
<Button
android:id="@+id/dialog_button_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="確定"
android:textColor="@color/colorAccent" />
</LinearLayout>
2、彈窗類
我們需要創建一個自定義的彈窗類,繼承Dialog類或其子類,重載構造函數以及實現必要的彈窗邏輯。例如,下面示例代碼創建一個繼承自Dialog的CustomDialog類,並為其中的Button設置點擊事件:
public class CustomDialog extends Dialog implements View.OnClickListener {
private TextView mTitle;
private TextView mMessage;
private Button mButtonCancel;
private Button mButtonOk;
private OnClickListener mOnClickListener;
public CustomDialog(Context context) {
this(context, R.style.Theme_CustomDialog);
}
public CustomDialog(Context context, int themeResId) {
super(context, themeResId);
setContentView(R.layout.dialog_custom_layout);
setCancelable(false);
mTitle = findViewById(R.id.dialog_title);
mMessage = findViewById(R.id.dialog_message);
mButtonCancel = findViewById(R.id.dialog_button_cancel);
mButtonOk = findViewById(R.id.dialog_button_ok);
mButtonCancel.setOnClickListener(this);
mButtonOk.setOnClickListener(this);
}
public CustomDialog setTitle(String title) {
mTitle.setText(title);
return this;
}
public CustomDialog setMessage(String message) {
mMessage.setText(message);
return this;
}
public CustomDialog setOnClickListener(OnClickListener onClickListener) {
mOnClickListener = onClickListener;
return this;
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.dialog_button_cancel) {
dismiss();
if (mOnClickListener != null) {
mOnClickListener.onNegativeClick();
}
} else if (id == R.id.dialog_button_ok) {
dismiss();
if (mOnClickListener != null) {
mOnClickListener.onPositiveClick();
}
}
}
public interface OnClickListener {
void onNegativeClick();
void onPositiveClick();
}
}
3、調用代碼
我們可以在Activity或Fragment中調用自定義的彈窗類,設置彈窗的標題、消息和點擊響應等。例如,下面示例代碼創建一個CustomDialog並彈出:
CustomDialog dialog = new CustomDialog(this)
.setTitle("提示")
.setMessage("是否保存當前內容?")
.setOnClickListener(new CustomDialog.OnClickListener() {
@Override
public void onNegativeClick() {
// 取消操作
}
@Override
public void onPositiveClick() {
// 確認操作
}
});
dialog.show();
二、彈窗功能擴展
除了基礎的彈窗功能,我們可以通過繼續擴展彈窗類的特性,增強彈窗的功能和靈活性。
1、多按鈕彈窗
多按鈕彈窗可以讓用戶在不同的選項中進行選擇。我們可以通過在自定義的彈窗布局文件中添加多個Button元素,以及在彈窗類中添加響應事件的處理邏輯。例如,下面的代碼實現了包含三個按鈕的CustomDialog:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_dialog_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorPrimary"
android:text="彈窗標題" />
<TextView
android:id="@+id/dialog_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="彈窗消息" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<Button
android:id="@+id/dialog_button_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:textColor="@color/colorPrimary"
android:layout_marginRight="20dp" />
<Button
android:id="@+id/dialog_button_ignore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="忽略"
android:textColor="@color/colorAccent"
android:layout_marginRight="20dp" />
<Button
android:id="@+id/dialog_button_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="確定"
android:textColor="@color/colorAccent" />
</LinearLayout>
</LinearLayout>
public class CustomDialog extends Dialog implements View.OnClickListener {
private TextView mTitle;
private TextView mMessage;
private Button mButtonCancel;
private Button mButtonIgnore;
private Button mButtonOk;
private OnClickListener mOnClickListener;
public CustomDialog(Context context) {
this(context, R.style.Theme_CustomDialog);
}
public CustomDialog(Context context, int themeResId) {
super(context, themeResId);
setContentView(R.layout.dialog_custom_layout);
setCancelable(false);
mTitle = findViewById(R.id.dialog_title);
mMessage = findViewById(R.id.dialog_message);
mButtonCancel = findViewById(R.id.dialog_button_cancel);
mButtonIgnore = findViewById(R.id.dialog_button_ignore);
mButtonOk = findViewById(R.id.dialog_button_ok);
mButtonCancel.setOnClickListener(this);
mButtonIgnore.setOnClickListener(this);
mButtonOk.setOnClickListener(this);
}
// 省略部分代碼
}
2、列表彈窗
列表彈窗可以讓用戶在一個列表中選擇一個選項。我們可以通過在自定義的彈窗布局文件中添加ListView元素,以及在彈窗類中添加適配器和點擊事件的處理邏輯。例如,下面的代碼實現了包含三個列表項的CustomListDialog:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_dialog_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorPrimary"
android:text="彈窗標題" />
<ListView
android:id="@+id/dialog_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/gray"
android:dividerHeight="1dp" />
<Button
android:id="@+id/dialog_button_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消"
android:textColor="@color/colorPrimary"
android:layout_marginTop="20dp" />
</LinearLayout>
public class CustomListDialog extends Dialog implements AdapterView.OnItemClickListener, View.OnClickListener {
private TextView mTitle;
private ListView mListView;
private Button mButtonCancel;
private List mItemList;
private OnItemClickListener mOnItemClickListener;
public CustomListDialog(Context context, List itemList) {
super(context, R.style.Theme_CustomDialog);
setContentView(R.layout.dialog_custom_list_layout);
setCancelable(false);
mTitle = findViewById(R.id.dialog_title);
mListView = findViewById(R.id.dialog_list_view);
mButtonCancel = findViewById(R.id.dialog_button_cancel);
mButtonCancel.setOnClickListener(this);
mItemList = itemList;
ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, itemList);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(this);
}
public CustomListDialog setTitle(String title) {
mTitle.setText(title);
return this;
}
public CustomListDialog setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
return this;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.dialog_button_cancel) {
dismiss();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = mItemList.get(position);
dismiss();
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(item);
}
}
public interface OnItemClickListener {
void onItemClick(String item);
}
}
3、自動消失彈窗
自動消失彈窗可以在顯示一定時間後自動消失,避免用戶沒有及時關閉彈窗,從而對用戶造成影響。我們可以在彈窗類中添加計時器和相關的判斷邏輯。例如,下面的代碼實現了一個3秒後自動消失的CustomAutoDismissDialog:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_dialog_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp" > <TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorPrimary"
android:text="彈窗標題" />
<TextView
android:id="@+id/dialog_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="彈窗消息" />
</LinearLayout>
public class CustomAutoDismissDialog extends Dialog {
private TextView mTitle;
private TextView mMessage;
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
dismiss();
}
};
public CustomAutoDismissDialog(Context context) {
this(context, R.style.Theme_CustomDialog);
}
public CustomAutoDismissDialog(Context context, int themeResId) {
super(context, themeResId
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/250624.html