Ce que j'essaie de faire: J'essaie de créer une boîte de dialogue personnalisée dans Android avec des coins arrondis.
Ce qui se passe: je suis capable de créer des dialogues personnalisés mais ils n'ont pas de coins arrondis. J'ai essayé d'ajouter un sélecteur mais je ne pouvais toujours pas obtenir des coins arrondis.
Voici mon code pour le même:
Code 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();
}
code 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>
Réponses:
Créez un xml dans drawable, disons dialog_bg.xml
définissez-le comme arrière-plan dans votre mise en page xml
Définissez l'arrière-plan de la vue racine de la boîte de dialogue sur transparent, car Android place votre disposition de boîte de dialogue dans une vue racine qui masque les coins de votre disposition personnalisée.
la source
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
est ce qui fait mal sur la plupart des autres threads SO! +1setBackgroundDrawable
semble être obsolète ... des alternatives à cela?dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
avantsetContentView
Vous devez effectuer les opérations suivantes:
Créez un arrière-plan avec des coins arrondis pour l'arrière-plan de la boîte de dialogue:
Maintenant, dans le fichier XML de votre boîte de dialogue dans la disposition racine, utilisez cet arrière-plan avec la marge requise:
enfin dans la partie java, vous devez faire ceci:
Cela fonctionne parfaitement pour moi.
la source
<corners android:radius="8dp"/>
, sinon vous aurez des problèmes de renduPath.isConvex is not supported
c'est l'avertissement que vous recevez généralement dans votre mise en page si vous utilisez une forme avec la même valeur pour tous les coins. stackoverflow.com/q/34736981/6605907dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
cela fonctionne pour moi
la source
dimen.xml
styles.xml
dialog_title_style.xml
dialog_background.xml
dialog_one_button.xml
OneButtonDialog.java
la source
J'ai créé une nouvelle façon sans avoir un arrière-plan dessinable, c'est de lui faire avoir CardView comme parent et de lui donner un
app:cardCornerRadius="20dp"
, puis de l'ajouter dans la classe javadialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
C'est une autre façon de le faire.
la source
Si vous utilisez des composants matériels :
CustomDialog.kt
styles.xml
la source
Vous pouvez utiliser la forme de l'arrière-plan comme-
Jetez un œil à ceci pour les détails.
la source
Le moyen le plus simple est d'utiliser de
la source
Réglage
empêchera le dialogue de projeter une ombre.
La solution est d'utiliser
où est R.drawable.dialog_rounded_background
la source
Pour tous ceux qui aiment faire des choses en XML, en particulier dans le cas où vous utilisez les actions des composants de l'architecture de navigation pour accéder aux boîtes de dialogue
Vous pouvez utiliser:
la source
Vous pouvez simplement utiliser MaterialAlertDialogBuilder pour créer un dialogue personnalisé avec des coins arrondis.
Créez d'abord un style pour la boîte de dialogue des matériaux comme ceci:
puis créez un objet Alert Dialog dans la classe Java comme ceci:
C'est tout ce que vous avez à faire.
la source
Avec la bibliothèque Androidx et le thème des composants matériels, vous pouvez remplacer la
getTheme()
méthode:avec:
Ou vous pouvez utiliser le
MaterialAlertDialogBuilder
inclus dans la bibliothèque de composants de matériaux:avec:
Si vous n'en avez pas besoin,
DialogFragment
utilisez simplement leMaterialAlertDialogBuilder
.la source
Voici la solution complète si vous souhaitez contrôler le rayon d'angle de la boîte de dialogue et conserver l' ombre d'élévation
Dialogue:
Disposition dialog_options.xml:
La clé est d'encapsuler le CardView avec un autre ViewGroup (ici FrameLayout) et de définir des marges pour créer de l'espace pour l'ombre d'élévation.
la source
Dans Kotlin, j'utilise une classe DoubleButtonDialog.Java avec la ligne
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
aussi importanteEn layout, on peut créer un dialog_double_button.xml
puis utilisez drawable.xml comme
la source
Pour le niveau d'API> = 28 attribut disponible
android:dialogCornerRadius
. Pour prendre en charge les versions précédentes de l'API, vous devez utiliseroù dialog_bg.xml
la source