Android自定義AlertDialog對話方塊並回傳Activity引數
阿新 • • 發佈:2019-01-23
需求
開發過程總會想要自己設計的對話方塊,有時候還需要在activity獲取對話方塊的一些操作結果。
思路
1.自定義對話方塊,並繼承AlertDialog
2.在自定義對話方塊中,定義一個介面,並宣告一個方法,將操作結果作為方法引數
3.在activity中,建立自定義對話方塊類,並呼叫自定義的介面,獲取操作結果
專案需求
主介面彈出對話方塊,並在主介面顯示對話方塊輸入的內容。(只為實現功能,比較簡單)
示例圖
程式碼示例
寫的比較匆忙,程式碼不是很規範~
1.佈局檔案
1)activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_input_confirm"
android:layout_width ="wrap_content"
android:layout_height="wrap_content"
android:text="確定輸入密碼 "
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/tv_password_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity ="center_horizontal"/>
</LinearLayout>
2)dialog_layout.xml
<?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:orientation="vertical"
android:background="#c7c7c7">
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入6位數的密碼"
android:gravity="center_horizontal"
android:layout_margin="20dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="20dp">
<Button
android:id="@+id/btn_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="確定 "/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消"/>
</LinearLayout>
</LinearLayout>
2.自定義對話方塊InputDialog.java
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.view.View;
import android.view.View.OnClickListener;
public class InputDialog extends AlertDialog implements OnClickListener{
private EditText etPassword; //編輯框
private Button btnConfrim, btnCancel; //確定取消按鈕
private OnEditInputFinishedListener mListener; //介面
public interface OnEditInputFinishedListener{
void editInputFinished(String password);
}
protected InputDialog(Context context, OnEditInputFinishedListener mListener) {
super(context);
this.mListener = mListener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
//控制元件
etPassword = (EditText)findViewById(R.id.et_password);
btnConfrim = (Button)findViewById(R.id.btn_confirm);
btnCancel = (Button)findViewById(R.id.btn_cancel);
btnConfrim.setOnClickListener(this);
btnCancel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_confirm) {
//確定
if (mListener != null) {
String password = etPassword.getText().toString();
mListener.editInputFinished(password);
}
dismiss();
}else {
//取消
dismiss();
}
}
}
3.MainActivty
import com.example.dialogtest.InputDialog.OnEditInputFinishedListener;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tvPasswordResul;
private Button btnInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvPasswordResul = (TextView) findViewById(R.id.tv_password_result);
btnInput = (Button) findViewById(R.id.btn_input_confirm);
btnInput.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
InputDialog dialog = new InputDialog(MainActivity.this, new OnEditInputFinishedListener(){
@Override
public void editInputFinished(String password) {
tvPasswordResul.setText(password);
}
});
dialog.setView(new EditText(MainActivity.this)); //若對話方塊無法彈出輸入法,加上這句話
dialog.show();
}
});
}
}
注意:在自定義的對話方塊如果不能彈出輸入法,就在show()方法呼叫之前,用setView(new EditText())新增一個空的EditText,由於是自定義的AlertDialog,有我們指定的佈局,所以這個空的,沒有其他影響。