Co próbuję zrobić: próbuję utworzyć niestandardowe okno dialogowe w systemie Android z zaokrąglonymi narożnikami.
Co się dzieje: mogę stworzyć własne okno dialogowe, ale nie ma ono zaokrąglonych rogów. Próbowałem dodać selektor, ale nadal nie mogłem uzyskać zaokrąglonych rogów.
Poniżej znajduje się mój kod na to samo:
Kod Java:
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();
}
kod xml:
<?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>
Odpowiedzi:
Utwórz plik XML do rysowania, powiedzmy dialog_bg.xml
ustaw go jako tło w pliku xml układu
Ustaw tło głównego widoku okna dialogowego na przezroczyste, ponieważ system Android umieszcza układ okna dialogowego w widoku głównym, który ukrywa rogi w niestandardowym układzie.
źródło
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
jest tym, co nie pasuje do większości innych wątków SO! +1setBackgroundDrawable
wydaje się być przestarzała ... czy są jakieś alternatywy?dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
przedsetContentView
Musisz wykonać następujące czynności:
Utwórz tło z zaokrąglonymi rogami jako tło okna dialogowego:
Teraz w pliku XML twojego Dialog w głównym układzie użyj tego tła z wymaganym marginesem:
w końcu w części java musisz to zrobić:
U mnie to działa idealnie.
źródło
<corners android:radius="8dp"/>
, w przeciwnym razie wystąpią problemy z renderowaniemPath.isConvex is not supported
jest to ostrzeżenie, które zwykle pojawia się w układzie, jeśli używasz kształtu o tej samej wartości dla wszystkich rogów. stackoverflow.com/q/34736981/6605907dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
to działa dla mnie
źródło
dimen.xml
style.xml
dialog_title_style.xml
dialog_background.xml
dialog_one_button.xml
OneButtonDialog.java
źródło
Zrobiłem nowy sposób bez możliwości rysowania tła, dzięki czemu ma on CardView jako element nadrzędny i nadaje mu plik
app:cardCornerRadius="20dp"
a następnie dodaj to w klasie javadialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
To inny sposób na zrobienie tego.
źródło
Jeśli używasz komponentów materiałowych :
CustomDialog.kt
style.xml
źródło
Możesz użyć kształtu tła jako:
Spójrz na to, aby poznać szczegóły.
źródło
najprostszym sposobem jest użycie z
źródło
Oprawa
zapobiegnie rzucaniu cienia przez okno dialogowe.
Rozwiązaniem jest użycie
gdzie jest R.drawable.dialog_rounded_background
źródło
Dla każdego, kto lubi robić rzeczy w XML, szczególnie w przypadku, gdy używasz akcji komponentu architektury nawigacji do przechodzenia do okien dialogowych
Możesz użyć:
źródło
Możesz po prostu użyć MaterialAlertDialogBuilder, aby utworzyć niestandardowe okno dialogowe z zaokrąglonymi narożnikami.
Najpierw utwórz styl dla okna dialogowego materiałów w następujący sposób:
następnie utwórz obiekt Alert Dialog w klasie Java w następujący sposób:
To wszystko, co musisz zrobić.
źródło
Za pomocą biblioteki Androidx i motywu składników materiału można nadpisać
getTheme()
metodę:z:
Lub możesz użyć
MaterialAlertDialogBuilder
zawartego w Bibliotece komponentów materiałów:z:
Jeśli nie potrzebujesz, po
DialogFragment
prostu użyjMaterialAlertDialogBuilder
.źródło
Oto kompletne rozwiązanie, jeśli chcesz kontrolować promień narożnika okna dialogowego i zachować cień elewacji
Dialog:
Układ dialog_options.xml:
Kluczem jest owinięcie CardView inną ViewGroup (tutaj FrameLayout) i ustawienie marginesów, aby utworzyć miejsce dla cienia elewacji.
źródło
W Kotlinie używam klasy DoubleButtonDialog.Java z linią
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
jako ważnąW układzie możemy utworzyć plik dialog_double_button.xml
następnie użyj drawable.xml jako
źródło
Dla poziomu API> = 28 dostępny atrybut
android:dialogCornerRadius
. Aby obsługiwać poprzednie wersje API, należy użyćgdzie dialog_bg.xml
źródło