實際的項目開發當中,經常需要根據實際的需求來自定義AlertDialog。最近在開發一個WIFI連接的功能,點擊WIFI需要彈出自定義密碼輸入框。在此權當記錄
效果圖

點擊首頁的Button即跳出對話框,顯示WIFI信息(TextView),密碼輸入框(EditText),取消和連接按鈕(Button)
實現
根據自己實際的需求,為AlertDialog創建一個布局,在此我需要定義一個如圖所示的WIFI密碼輸入框,故在 res/layout 目錄下建立一個 dialog_layout.xml 文件。
在該布局中,定義一個TextView顯示wifi名稱,一條分割線,一個EditText用于密碼輸入,以及兩個Button用于取消與連接
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="180dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center" android:text="WIFI" android:textSize="18sp" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:background="#F5F5F5" /> <EditText android:id="@+id/et_passwd" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:focusable="true" android:focusableInTouchMode="true" android:hint="Password" android:inputType="numberPassword" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal"> <Button android:id="@+id/btn_cancel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" android:text="取消" android:textColor="#1965db" android:textSize="16sp" /> <Button android:id="@+id/btn_connect" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" android:text="連接" android:textColor="#1965db" android:textSize="16sp" /> </LinearLayout></LinearLayout>
新建 WifiDialog.java 繼承 AlertDialog ,并引入剛剛所定義的 dialog_layout.xml 布局,并在這里做我們的邏輯操作
聲明構造方法,傳入 Context
在 onCreate() 中加載布局,獲取 View,為按鈕設置點擊事件
這邊尤其要注意一個問題,在 Dialog 中,定義 EditText 后,在彈出框中點擊 EditText 彈不出鍵盤來進行輸入,故這里要用 this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) 保證鍵盤能彈出以用來輸入密碼
package com.example.test.dialogtest;import android.app.AlertDialog;import android.content.Context;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/** * Created by AaronPasi on 2017/9/16. */public class WifiDialog extends AlertDialog implements View.OnClickListener { EditText mEtPasswd; Button mBtnCancel, mBtnConnect; Context mContext; public WifiDialog(Context context) { super(context); mContext = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_layout); mEtPasswd = (EditText) findViewById(R.id.et_passwd); //保證EditText能彈出鍵盤 this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); this.setCancelable(false); mBtnCancel = (Button) findViewById(R.id.btn_cancel); mBtnCancel.setOnClickListener(this); mBtnConnect = (Button) findViewById(R.id.btn_connect); mBtnConnect.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_cancel: this.dismiss(); break; case R.id.btn_connect: if (TextUtils.isEmpty(mEtPasswd.getText())) { Toast.makeText(mContext, "密碼不能為空", Toast.LENGTH_SHORT).show(); } else { this.dismiss(); Toast.makeText(mContext, mEtPasswd.getText().toString(), Toast.LENGTH_SHORT).show(); } break; default: break; } }}調用的話就簡單了,new 一個 WifiDialog對象,并調用 show() 方法即可。這里在 MainActivity 簡單聲明一個 Button,設置點擊事件,彈出對話框。
package com.example.test.dialogtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mDialogBtn; private WifiDialog mDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDialogBtn = (Button) findViewById(R.id.btn_dialog); mDialogBtn.setOnClickListener(this); } @Override public void onClick(View view) { if (view.getId() == R.id.btn_dialog) { mDialog = new WifiDialog(this); mDialog.show(); } }}總結
以上所述是小編給大家帶來的Android 自定義AlertDialog對話框,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言!
新聞熱點
疑難解答