Dialog 預設含標題區,即使不設標題仍佔據空間。若需完全無標題的自訂對話框,應使用 AlertDialog.Builder 並呼叫 setView() 設定自訂佈局,系統會自動隱藏標題區。
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);
// 即使無 setTitle,仍有標題區空白空間
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.my_dialog, null);
// 關鍵:setView 會讓系統隱藏標題區
builder.setView(dialogView);
AlertDialog dialog = builder.create();
dialog.show();
// 後續操作 dialogView 中的元件
TextView tv = dialogView.findViewById(R.id.textView);
tv.setText("自訂內容");
Button btn = dialogView.findViewById(R.id.btnConfirm);
btn.setOnClickListener(v -> dialog.dismiss());
| 方案 | 標題區 | 自訂程度 | 適用場景 |
|---|---|---|---|
Dialog + setContentView | 保留(有空白) | 中 | 簡單內容、需系統標題 |
AlertDialog.Builder + setView | 自動隱藏 | 高 | 完全自訂佈局、無標題需求 |
DialogFragment + onCreateView | 完全可控 | 最高 | 複雜邏輯、生命週期管理、配置變更保存 |
BottomSheetDialogFragment | 無 | 高 | 底部彈出、鍵盤友善、Material Design 規範 |
public class CustomDialogFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view = LayoutInflater.from(requireActivity()).inflate(R.layout.dialog_custom, null);
builder.setView(view);
view.findViewById(R.id.btnConfirm).setOnClickListener(v -> dismiss());
view.findViewById(R.id.btnCancel).setOnClickListener(v -> dismiss());
return builder.create();
}
@Override
public void onStart() {
super.onStart();
// 可選:設定寬度佔螢幕 90%
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().setLayout(
(int) (getResources().getDisplayMetrics().widthPixels * 0.9),
ViewGroup.LayoutParams.WRAP_CONTENT
);
}
}
}
// 使用
new CustomDialogFragment().show(getSupportFragmentManager(), "custom_dialog");
AlertDialog.Builder.setView() 會移除標題、圖示、按鈕區,完全由自訂佈局接管。background 與 padding,避免貼邊。DialogFragment,支援配置變更重建、返回堆疊管理。採用 AlertDialog.Builder.setView() 或 DialogFragment,即能建立無標題、完全自訂的現代化對話框。