天天看點

Android AlertDialog使用

本示例功能為點選按鈕,彈出對話框,自定義AlertDialog的布局View,擷取輸入框EditText中的内容,點選确定按鈕以及空白處不關閉對話框。

  1. 建立布局檔案,設定按鈕的點選事件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mazaiting.alertdialogtest.MainActivity"
    >

  <Button
      android:onClick="open"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="顯示對話框"
      />
</RelativeLayout>
           

首頁面Activity的初始配置代碼

public class MainActivity extends AppCompatActivity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  }

  /**
   * 按鈕打開事件
   */
  public void open(View view){

  }
}
           
  1. 接下來的代碼都寫在open(View view)這個函數中。首先建立出AlertDialog的布局檔案,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_margin="50dp"
    android:padding="15dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_tip"
        android:gravity="center"
        android:text="請輸入文字"
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:textSize="16sp"
        android:layout_marginTop="20dp"
        android:id="@+id/et_number"
        android:hint="請輸入文字"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
           
  1. 現在open(View view)方法中,加載出布局。
// 加載布局
    View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_input_id,null);
    EditText et_number = (EditText) dialogView.findViewById(R.id.et_number);
           
  1. 建立AlertDialog, 并實作其相應設定
/**
   * 按鈕打開事件
   */
  public void open(View view){
    // 加載布局
    View dialogView = LayoutInflater.from(this).inflate(R.layout.dialog_input_id,null);
    final EditText editText = (EditText) dialogView.findViewById(R.id.et_number);

    new AlertDialog.Builder(this) // 使用android.support.v7.app.AlertDialog
        .setView(dialogView) // 設定布局
        .setCancelable(false) // 設定點選空白處不關閉
        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialog, int which) {
            String text = editText.getText().toString();
            if(TextUtils.isEmpty(text)){ // 判斷輸入的内容是否為空
              setDialogIsShowing(dialog, false); // 設定不關閉
              Toast.makeText(MainActivity.this, "内容不能為空", Toast.LENGTH_SHORT)
                  .show();
            }else{
              Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT)
                  .show();
            }
          }
        }) // 設定确定按鈕,并設定監聽事件})
        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialog, int which) {
            setDialogIsShowing(dialog, true); // 設定關閉
          }
        }) // 設定取消按鈕,并設定監聽事件
        .create() // 建立對話框
        .show(); // 顯示對話框
  }
           
  1. 設定是否關閉對話框,函數内容:
/**
   * 設定對話框是否顯示
   * @param dialog 對話框
   * @param isClose 是否顯示. true為關閉,false為不關閉
   */
  private void setDialogIsShowing(DialogInterface dialog, boolean isClose) {
    try {
      // 擷取到android.app.Dialog類
      Field mShowing = dialog.getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
      mShowing.setAccessible(true); // 設定可通路
      mShowing.set(dialog,isClose); // 設定是否關閉
    } catch (NoSuchFieldException | IllegalAccessException e) {
      e.printStackTrace();
    }
  }
           
  1. 點選空白處不關閉對話框,應添加

    .setCancelable(false) // 設定點選空白處不關閉

    其中false為不關閉,true為關閉。

繼續閱讀