Was ich versuche zu tun: Ich versuche, einen benutzerdefinierten Dialog in Android mit abgerundeten Ecken zu erstellen.
Was passiert: Ich kann benutzerdefinierte Dialoge erstellen, aber es gibt keine abgerundeten Ecken. Ich habe versucht, einen Selektor hinzuzufügen, konnte aber immer noch keine abgerundeten Ecken erzielen.
Unten ist mein Code für das gleiche:
Java-Code:
private void launchDismissDlg() {
dialog = new Dialog(getActivity(), android.R.style.Theme_Dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dlg_dismiss);
dialog.setCanceledOnTouchOutside(true);
Button btnReopenId = (Button) dialog.findViewById(R.id.btnReopenId);
Button btnCancelId = (Button) dialog.findViewById(R.id.btnCancelId);
btnReopenId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
btnCancelId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
dialog.show();
}
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical" >
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text=""I WOULD LIKE TO DISMISS THE VENDOR""
android:textColor="@color/col_dlg_blue_light"
android:textSize="14sp"
android:textStyle="bold" />
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="BECAUSE"
android:textColor="@android:color/black"
android:textStyle="bold" />
</TableRow>
<TableRow
android:id="@+id/tableRow4"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnReopenId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/col_dlg_green_light"
android:text="REOPEN"
android:padding="5dp"
android:textSize="14sp"
android:textColor="@android:color/white"
android:textStyle="bold" />
<Button
android:id="@+id/btnCancelId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/col_dlg_pink_light"
android:text="CANCEL"
android:padding="5dp"
android:textSize="14sp"
android:textColor="@android:color/white"
android:textStyle="bold" />
</TableRow>
</TableLayout>
</LinearLayout>
Antworten:
Erstellen Sie eine XML-Datei in drawable, z. B. dialog_bg.xml
Legen Sie es als Hintergrund in Ihrer Layout-XML fest
Stellen Sie den Hintergrund der Stammansicht des Dialogfelds auf transparent ein, da Android Ihr Dialogfeldlayout in eine Stammansicht einfügt, die die Ecken in Ihrem benutzerdefinierten Layout verbirgt.
quelle
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
ist das, was bei den meisten anderen SO-Threads passiert! +1setBackgroundDrawable
scheint veraltet zu sein ... irgendwelche Alternativen dazu?dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
vorsetContentView
Sie müssen Folgendes tun:
Erstellen Sie einen Hintergrund mit abgerundeten Ecken für den Hintergrund des Dialogfelds:
Verwenden Sie jetzt in der XML-Datei Ihres Dialogs im Stammlayout diesen Hintergrund mit dem erforderlichen Rand:
Schließlich müssen Sie im Java-Teil Folgendes tun:
Das funktioniert perfekt für mich.
quelle
<corners android:radius="8dp"/>
, da sonst Rendering-Probleme auftretenPath.isConvex is not supported
Dies ist die Warnung, die Sie normalerweise in Ihrem Layout erhalten, wenn Sie für alle Ecken eine Form mit demselben Wert verwenden. stackoverflow.com/q/34736981/6605907dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
das funktioniert bei mir
quelle
dimen.xml
styles.xml
dialog_title_style.xml
dialog_background.xml
dialog_one_button.xml
OneButtonDialog.java
quelle
Ich habe einen neuen Weg eingeschlagen, ohne dass ein Hintergrund gezeichnet werden kann, indem ich CardView als übergeordnetes Element habe und ihm ein gebe
app:cardCornerRadius="20dp"
und dieses dann in die Java-Klasse einfügedialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Es ist ein anderer Weg, es zu schaffen.
quelle
Wenn Sie Materialkomponenten verwenden :
CustomDialog.kt
styles.xml
quelle
Sie können die Form für den Hintergrund verwenden.
Schauen Sie sich das für die Details an.
quelle
Der einfachste Weg ist die Verwendung von
quelle
Rahmen
verhindert, dass der Dialog einen Schatten wirft.
Lösung ist zu verwenden
Wo ist R.drawable.dialog_rounded_background
quelle
Für alle, die gerne Dinge in XML tun, insbesondere wenn Sie Komponentenaktionen der Navigationsarchitektur verwenden, um zu Dialogen zu navigieren
Sie können verwenden:
quelle
Sie können einfach MaterialAlertDialogBuilder verwenden, um ein benutzerdefiniertes Dialogfeld mit abgerundeten Ecken zu erstellen.
Erstellen Sie zunächst einen Stil für den Materialdialog wie folgt:
Erstellen Sie dann ein Alert Dialog-Objekt in der Java-Klasse wie folgt:
Das ist alles was Sie tun müssen.
quelle
Hier ist die vollständige Lösung, wenn Sie den Eckenradius des Dialogfelds steuern und den Höhenschatten beibehalten möchten
Dialog:
dialog_options.xml layout:
Der Schlüssel besteht darin, die CardView mit einer anderen ViewGroup (hier FrameLayout) zu versehen und Ränder festzulegen, um Platz für den Höhenschatten zu schaffen.
quelle
In Kotlin verwende ich eine Klasse DoubleButtonDialog.Java mit
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
einer wichtigen ZeileIm Layout können wir eine dialog_double_button.xml erstellen
Verwenden Sie dann drawable.xml als
quelle
Für API-Ebene> = 28 verfügbares Attribut
android:dialogCornerRadius
. Zur Unterstützung früherer API-Versionen muss verwendet werdenwo dialog_bg.xml
quelle
Mit der Androidx-Bibliothek und dem Material Components Theme können Sie die
getTheme()
Methode überschreiben :mit:
Oder Sie können das
MaterialAlertDialogBuilder
in der Materialkomponentenbibliothek enthaltene verwenden:mit:
Wenn Sie keine brauchen, verwenden Sie
DialogFragment
einfach dieMaterialAlertDialogBuilder
.quelle