DialogFragmentGenişliğinizi ve yüksekliğini kontrol etmenin bir yolu , iletişim kutusunun değerleri varsa görünümünüzün genişliğine ve yüksekliğine saygı duymasını sağlamaktır WRAP_CONTENT.
kullanma ThemeOverlay.AppCompat.Dialog
Bunu başarmanın basit bir yolu ThemeOverlay.AppCompat.Dialog, Android Destek Kitaplığı'nda bulunan stili kullanmaktır .
DialogFragmentile 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;
}
DialogFragmentile AlertDialog(uyarı:) 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();
}
İletişim ThemeOverlay.AppCompat.Dialogkutularınızı oluştururken, uygulamanızın xml temasına ekleyerek varsayılan tema olarak da ayarlayabilirsiniz .
Dikkatli olun, çünkü birçok iletişim kutusunun iyi görünmesi için varsayılan minimum genişliğe ihtiyacı vardır.
<!-- 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>
DialogFragmentaşağıdakilerden Dialogyararlanarak 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;
}
DialogFragmentile AlertDialog, android:alertDialogThemeveya alertDialogTheme(uyarı:) kullanarak 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();
}
Bonus
Eski Android API'larında, Dialogadları nedeniyle bazı genişlik sorunları var gibi görünüyor (bir tane belirlemeseniz bile). Stili
kullanmak istemiyorsanız ThemeOverlay.AppCompat.Dialogve Dialogbir başlığa ihtiyacınız yoksa (veya özel bir stiliniz yoksa), devre dışı bırakmak isteyebilirsiniz:
@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;
}
Eski cevap, çoğu durumda çalışmaz
Diyalogun programlı olarak sabit bir boyut belirtmeden, düzenimin genişliğine ve yüksekliğine saygı duymaya çalışıyordum.
Bunu anladım android:windowMinWidthMinorve android:windowMinWidthMajorsoruna neden oluyordum. Benim temamda yer almasalar Activityda Dialog, yine de bir Activityşekilde temaya uygulanıyorlardı .
Üç olası çözüm buldum.
1.Çözüm: Özel bir iletişim kutusu teması oluşturun ve 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);
}
Çözüm 2: Bir kullanılmak üzere özel bir tema oluşturmak ContextThemeWrapperolarak görev alacağını Contextiletişim için. Özel bir iletişim kutusu teması oluşturmak istemiyorsanız bunu kullanın (örneğin, tarafından belirtilen temayı kullanmak istediğinizde 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());
}
(Bir ile Çözüm 3 AlertDialog): uygulamak android:windowMinWidthMinorve android:windowMinWidthMajoriçine ContextThemeWrapperyarattığı 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();
}