DialogFragment
Geniş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 .
DialogFragment
ile 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
ile 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.Dialog
kutuları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>
DialogFragment
aşağıdakilerden Dialog
yararlanarak 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
ile AlertDialog
, android:alertDialogTheme
veya 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, Dialog
adları nedeniyle bazı genişlik sorunları var gibi görünüyor (bir tane belirlemeseniz bile). Stili
kullanmak istemiyorsanız ThemeOverlay.AppCompat.Dialog
ve Dialog
bir 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:windowMinWidthMinor
ve android:windowMinWidthMajor
soruna neden oluyordum. Benim temamda yer almasalar Activity
da 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 ContextThemeWrapper
olarak görev alacağını Context
iletiş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:windowMinWidthMinor
ve android:windowMinWidthMajor
içine ContextThemeWrapper
yarattığı 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();
}