首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Dialog 中取得 EditText 值:傳入同一 View 實例關鍵

     編輯:程式設計綜合問答

常見錯誤:setView(getLayoutInflater().inflate(...)) 呼叫兩次 inflate,導致 Dialog 顯示的 View 與代碼持有的 viewDialog 不是同一個實例,findViewById 找到的 EditText 為空。

錯誤代碼

View viewDialog = getLayoutInflater().inflate(R.layout.ad_dialog, null);
new AlertDialog.Builder(this)
    .setView(getLayoutInflater().inflate(R.layout.ad_dialog, null)) // 再次 inflate!
    .setPositiveButton("確定", (dialog, which) -> {
        EditText et = viewDialog.findViewById(R.id.ad_delete_number); // 找不到輸入值
        ...
    }).show();

正確代碼

View viewDialog = getLayoutInflater().inflate(R.layout.ad_dialog, null);
new AlertDialog.Builder(this)
    .setView(viewDialog) // 傳入同一實例
    .setPositiveButton("確定", (dialog, which) -> {
        EditText et = viewDialog.findViewById(R.id.ad_delete_number);
        String text = et.getText().toString();
        // 處理邏輯
    }).show();

最佳實踐:DialogFragment

public class InputDialogFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.ad_dialog, null);
        EditText et = view.findViewById(R.id.ad_delete_number);
        return new AlertDialog.Builder(requireContext())
            .setView(view)
            .setPositiveButton("確定", (d, w) -> {
                String val = et.getText().toString();
                // 透過介面回傳給 Activity
            })
            .create();
    }
}

DialogFragment 自動管理生命週期,避免視窗洩漏與 View 實例混淆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved