Jednym ze sposobów kontrolowania DialogFragment
szerokości i wysokości jest upewnienie się, że okno dialogowe uwzględnia szerokość i wysokość widoku, jeśli ich wartość to WRAP_CONTENT
.
Za pomocą ThemeOverlay.AppCompat.Dialog
Prostym sposobem na osiągnięcie tego jest użycie ThemeOverlay.AppCompat.Dialog
stylu zawartego w bibliotece obsługi systemu Android.
DialogFragment
z 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
z AlertDialog
(zastrzeżenie:) 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();
}
Możesz także ustawić ThemeOverlay.AppCompat.Dialog
jako domyślny motyw podczas tworzenia okien dialogowych, dodając go do motywu xml swojej aplikacji.
Uważaj, ponieważ wiele okien dialogowych wymaga domyślnej minimalnej szerokości, aby dobrze wyglądać.
<!-- 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
z Dialog
wykorzystaniem 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
z AlertDialog
, korzystając z android:alertDialogTheme
or alertDialogTheme
(ostrzeżenie:) 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();
}
Premia
W starszych interfejsach API systemu Android Dialog
wydaje się, że mają pewne problemy z szerokością, ze względu na ich tytuł (nawet jeśli go nie ustawisz).
Jeśli nie chcesz używać ThemeOverlay.AppCompat.Dialog
stylu i Dialog
nie potrzebujesz tytułu (lub masz niestandardowy), możesz go wyłączyć:
@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;
}
Nieaktualna odpowiedź, w większości przypadków nie zadziała
Starałem się, aby okno dialogowe uwzględniało szerokość i wysokość mojego układu, bez programowego określania stałego rozmiaru.
Doszedłem do tego android:windowMinWidthMinor
i android:windowMinWidthMajor
spowodowałem problem. Mimo że nie były one zawarte w temacie mojego Activity
lub , w jakiś sposób Dialog
nadal były do niego stosowane Activity
.
Wymyśliłem trzy możliwe rozwiązania.
Rozwiązanie 1: utwórz niestandardowy motyw okna dialogowego i użyj go podczas tworzenia okna dialogowego w 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);
}
Rozwiązanie 2: stworzenie własnego motywu być używany w ContextThemeWrapper
które będą służyć jako Context
dla okna. Użyj tego, jeśli nie chcesz tworzyć niestandardowego motywu okna dialogowego (na przykład, gdy chcesz użyć motywu określonego przez 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());
}
Rozwiązanie 3 (z AlertDialog
): wymuś android:windowMinWidthMinor
i android:windowMinWidthMajor
do ContextThemeWrapper
utworzonego przez 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();
}