วิธีหนึ่งในการควบคุมของคุณกว้างและความสูงคือการทำให้แน่ใจว่ากว้างประการโต้ตอบของมุมมองของคุณและถ้าค่าความสูงของพวกเขาคือDialogFragment
WRAP_CONTENT
การใช้ ThemeOverlay.AppCompat.Dialog
วิธีง่ายๆในการบรรลุเป้าหมายนี้คือการใช้ประโยชน์จากThemeOverlay.AppCompat.Dialog
สไตล์ที่รวมอยู่ในห้องสมุดสนับสนุน Android
DialogFragment
ด้วยDialog
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
dialog.setContentView(view);
return dialog;
}
DialogFragment
ด้วยAlertDialog
(คำเตือน:) minHeight="48dp"
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
builder.setView(view);
return builder.create();
}
คุณยังสามารถตั้งThemeOverlay.AppCompat.Dialog
เป็นธีมเริ่มต้นเมื่อสร้างกล่องโต้ตอบโดยเพิ่มไปยังธีม xml ของแอป
ระวังเนื่องจากกล่องโต้ตอบหลาย ๆ อันต้องการความกว้างต่ำสุดที่เป็นค่าเริ่มต้นเพื่อให้ดูดี
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- For Android Dialog. -->
<item name="android:dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For Android AlertDialog. -->
<item name="android:alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- For AppCompat AlertDialog. -->
<item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>
<!-- Other attributes. -->
</style>
DialogFragment
ด้วยDialog
ทำให้การใช้android:dialogTheme
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.setContentView(view);
return dialog;
}
DialogFragment
ด้วยAlertDialog
, การใช้งานandroid:alertDialogTheme
หรือalertDialogTheme
(caveat:) minHeight="48dp"
:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setView(view);
return builder.create();
}
โบนัส
สำหรับ Android API ที่เก่ากว่าDialog
ดูเหมือนว่าจะมีปัญหาด้านความกว้างเนื่องจากมีชื่อเรื่อง (แม้ว่าคุณจะไม่ได้ตั้งค่าก็ตาม)
หากคุณไม่ต้องการใช้ThemeOverlay.AppCompat.Dialog
สไตล์และDialog
ไม่ต้องการชื่อ (หรือมีแบบกำหนดเอง) คุณอาจต้องการปิดใช้งาน:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.dialog_view, null);
Dialog dialog = new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
return dialog;
}
คำตอบที่ล้าสมัยจะไม่ทำงานในกรณีส่วนใหญ่
ฉันพยายามทำให้กล่องโต้ตอบเคารพความกว้างและความสูงของเค้าโครงโดยไม่ระบุขนาดคงที่โดยทางโปรแกรม
ฉันคิดว่าandroid:windowMinWidthMinor
และandroid:windowMinWidthMajor
ทำให้เกิดปัญหา แม้ว่าพวกเขาจะไม่รวมอยู่ในธีมของฉันActivity
หรือDialog
พวกเขาก็ยังคงถูกนำไปใช้กับActivity
ชุดรูปแบบ แต่อย่างใด
ฉันคิดวิธีแก้ปัญหาที่เป็นไปได้สามข้อ
โซลูชันที่ 1:DialogFragment
สร้างรูปแบบโต้ตอบที่กำหนดเองและใช้งานได้เมื่อมีการสร้างโต้ตอบในที่
<style name="Theme.Material.Light.Dialog.NoMinWidth" parent="android:Theme.Material.Light.Dialog">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), R.style.Theme_Material_Light_Dialog_NoMinWidth);
}
โซลูชันที่ 2:สร้างชุดรูปแบบกำหนดเองเพื่อใช้ในการContextThemeWrapper
ที่จะทำหน้าที่เป็นContext
กล่องโต้ตอบ ใช้สิ่งนี้หากคุณไม่ต้องการสร้างธีมไดอะล็อกที่กำหนดเอง (เช่นเมื่อคุณต้องการใช้ธีมที่ระบุโดยandroid:dialogTheme
)
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(new ContextThemeWrapper(getActivity(), R.style.Theme_Window_NoMinWidth), getTheme());
}
โซลูชัน 3 (กับAlertDialog
):บังคับใช้android:windowMinWidthMinor
และandroid:windowMinWidthMajor
เข้าสู่ContextThemeWrapper
AlertDialog$Builder
ที่สร้างขึ้นโดย
<style name="Theme.Window.NoMinWidth" parent="">
<item name="android:windowMinWidthMinor">0dip</item>
<item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState) {
View view = new View(); // Inflate your view here.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
// Make sure the dialog width works as WRAP_CONTENT.
builder.getContext().getTheme().applyStyle(R.style.Theme_Window_NoMinWidth, true);
return builder.create();
}