常見錯誤: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();
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 實例混淆。