How to make custom dialog with rounded corners in android

前端 未结 16 729
半阙折子戏
半阙折子戏 2020-11-28 02:15

What I am trying to do: I am trying to make a custom dialog in android With rounded corners.

What is happening: I am able to make c

相关标签:
16条回答
  • 2020-11-28 02:17

    simplest way is to use from

    CardView and its card:cardCornerRadius

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:card="http://schemas.android.com/apk/res-auto"
     android:orientation="vertical"
     android:id="@+id/cardlist_item"
     android:layout_width="match_parent"
     android:layout_height="130dp"
     card:cardCornerRadius="40dp"
     android:layout_marginLeft="8dp"
     android:layout_marginRight="8dp"
     android:layout_marginTop="5dp"
     android:layout_marginBottom="5dp"
     android:background="@color/white">
    
      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="12sp"
        android:orientation="vertical"
        android:weightSum="1">
        </RelativeLayout>
    
    </android.support.v7.widget.CardView>
    

    And when you are creating your Dialog

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    
    0 讨论(0)
  • 2020-11-28 02:19

    With the Androidx library and Material Components Theme you can override the getTheme() method:

    import androidx.fragment.app.DialogFragment
    
    class RoundedDialog: DialogFragment() {
    
        override fun getTheme() = R.style.RoundedCornersDialog
    
        //....
    
    }
    

    with:

    <style name="RoundedCornersDialog" parent="@style/Theme.MaterialComponents.Dialog">
        <item name="dialogCornerRadius">16dp</item>
    </style>
    

    Or you can use the MaterialAlertDialogBuilder included in the Material Components Library:

    import androidx.fragment.app.DialogFragment
    import com.google.android.material.dialog.MaterialAlertDialogBuilder
    
    class RoundedAlertDialog : DialogFragment() {
    
        //...
    
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            return MaterialAlertDialogBuilder(requireActivity(), R.style.MaterialAlertDialog_rounded)
                    .setTitle("Test")
                    .setMessage("Message")
                    .setPositiveButton("OK", null)
                    .create()
        }
    
    }
    

    with:

    <style name="MaterialAlertDialog_rounded" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
        <item name="shapeAppearanceOverlay">@style/DialogCorners</item>
    </style>
    
    <style name="DialogCorners">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">16dp</item>
    </style>
    

    If you don't need a DialogFragment just use the MaterialAlertDialogBuilder.

    0 讨论(0)
  • 2020-11-28 02:19

    In Kotlin, I am using a class DoubleButtonDialog.Java with line window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) as important one

    class DoubleButtonDialog(context: Context) : Dialog(context, R.style.DialogTheme) {
    
        private var cancelableDialog: Boolean = true
        private var titleDialog: String? = null
        private var messageDialog: String? = null
        private var leftButtonDialog: String = "Yes"
        //    private var rightButtonDialog: String? = null
        private var onClickListenerDialog: OnClickListener? = null
    
        override fun onCreate(savedInstanceState: Bundle?) {
            window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
            //requestWindowFeature(android.view.Window.FEATURE_NO_TITLE)
            setCancelable(cancelableDialog)
            setContentView(R.layout.dialog_double_button)
    //        val btnNegative = findViewById<Button>(R.id.btnNegative)
    //        btnNegative.visibility = View.GONE
    //        if (rightButtonDialog != null) {
    //            btnNegative.visibility = View.VISIBLE
    //            btnNegative.text = rightButtonDialog
    //            btnNegative.setOnClickListener {
    //                dismiss()
    //                onClickListenerDialog?.onClickCancel()
    //            }
    //        }
            val btnPositive = findViewById<Button>(R.id.btnPositive)
            btnPositive.text = leftButtonDialog
            btnPositive.setOnClickListener {
                onClickListenerDialog?.onClick()
                dismiss()
            }
            (findViewById<TextView>(R.id.title)).text = titleDialog
            (findViewById<TextView>(R.id.message)).text = messageDialog
            super.onCreate(savedInstanceState)
        }
    
        constructor(
            context: Context, cancelableDialog: Boolean, titleDialog: String?,
            messageDialog: String, leftButtonDialog: String, /*rightButtonDialog: String?,*/
            onClickListenerDialog: OnClickListener
        ) : this(context) {
            this.cancelableDialog = cancelableDialog
            this.titleDialog = titleDialog
            this.messageDialog = messageDialog
            this.leftButtonDialog = leftButtonDialog
    //        this.rightButtonDialog = rightButtonDialog
            this.onClickListenerDialog = onClickListenerDialog
        }
    }
    
    
    interface OnClickListener {
        //    fun onClickCancel()
        fun onClick()
    }
    

    In layout, we can create a dialog_double_button.xml

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="@dimen/dimen_10"
            android:background="@drawable/bg_double_button"
            android:orientation="vertical"
            android:padding="@dimen/dimen_5">
    
            <TextView
                android:id="@+id/title"
                style="@style/TextViewStyle"
                android:layout_gravity="center_horizontal"
                android:layout_margin="@dimen/dimen_10"
                android:fontFamily="@font/campton_semi_bold"
                android:textColor="@color/red_dark4"
                android:textSize="@dimen/text_size_24"
                tools:text="@string/dial" />
    
            <TextView
                android:id="@+id/message"
                style="@style/TextViewStyle"
                android:layout_gravity="center_horizontal"
                android:layout_margin="@dimen/dimen_10"
                android:gravity="center"
                android:textColor="@color/semi_gray_2"
                tools:text="@string/diling_police_number" />
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dimen_10"
                android:gravity="center"
            android:orientation="horizontal"
            android:padding="@dimen/dimen_5">
    
            <!--<Button
                android:id="@+id/btnNegative"
                style="@style/ButtonStyle"
                android:layout_width="0dp"
                android:layout_height="@dimen/dimen_40"
                android:layout_marginEnd="@dimen/dimen_10"
                android:layout_weight=".4"
                android:text="@string/cancel" />-->
    
            <Button
                android:id="@+id/btnPositive"
                style="@style/ButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:backgroundTint="@color/red_dark4"
                android:fontFamily="@font/campton_semi_bold"
                android:padding="@dimen/dimen_10"
                android:text="@string/proceed"
                android:textAllCaps="false"
                android:textColor="@color/white"
                android:textSize="@dimen/text_size_20" />
        </LinearLayout>
    </LinearLayout>
    

    then use drawable.xml as

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid
            android:color="@color/white"/>
        <corners
            android:radius="@dimen/dimen_10" />
        <padding
            android:left="@dimen/dimen_10"
            android:top="@dimen/dimen_10"
            android:right="@dimen/dimen_10"
            android:bottom="@dimen/dimen_10" />
    </shape>
    
    0 讨论(0)
  • 2020-11-28 02:20

    Create a xml in drawable , say dialog_bg.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid
            android:color="@color/white"/>
        <corners
            android:radius="30dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
    

    set it as the background in your layout xml

    android:background="@drawable/dialog_bg"
    

    Set the background of the dialog's root view to transparent, because Android puts your dialog layout within a root view that hides the corners in your custom layout.

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    
    0 讨论(0)
  • 2020-11-28 02:21

    dimen.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <integer name="weight">1</integer>
    
        <dimen name="dialog_top_radius">21dp</dimen>
    
        <dimen name="textview_dialog_head_min_height">50dp</dimen>
        <dimen name="textview_dialog_drawable_padding">5dp</dimen>
    
        <dimen name="button_dialog_layout_margin">3dp</dimen>
    
    
    </resources>
    

    styles.xml

    <style name="TextView.Dialog">
            <item name="android:paddingLeft">@dimen/dimen_size</item>
            <item name="android:paddingRight">@dimen/dimen_size</item>
            <item name="android:gravity">center_vertical</item>
            <item name="android:textColor">@color/black</item>
        </style>
    
        <style name="TextView.Dialog.Head">
            <item name="android:minHeight">@dimen/textview_dialog_head_min_height</item>
            <item name="android:textColor">@color/white</item>
            <item name="android:background">@drawable/dialog_title_style</item>
            <item name="android:drawablePadding">@dimen/textview_dialog_drawable_padding</item>
        </style>
    
        <style name="TextView.Dialog.Text">
            <item name="android:textAppearance">@style/Font.Medium.16</item>
        </style>
    
        <style name="Button" parent="Base.Widget.AppCompat.Button">
            <item name="android:layout_height">@dimen/button_min_height</item>
            <item name="android:layout_width">match_parent</item>
            <item name="android:textColor">@color/white</item>
            <item name="android:gravity">center</item>
            <item name="android:textAppearance">@style/Font.Medium.20</item>
        </style>
    
     <style name="Button.Dialog">
            <item name="android:layout_weight">@integer/weight</item>
            <item name="android:layout_margin">@dimen/button_dialog_layout_margin</item>
        </style>
    
        <style name="Button.Dialog.Middle">
            <item name="android:background">@drawable/button_primary_selector</item>
        </style>
    

    dialog_title_style.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
    
        <gradient
            android:angle="270"
            android:endColor="@color/primaryDark"
            android:startColor="@color/primaryDark" />
    
        <corners
            android:topLeftRadius="@dimen/dialog_top_radius"
            android:topRightRadius="@dimen/dialog_top_radius" />
    
    </shape>
    

    dialog_background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="@color/backgroundDialog" />
        <corners
            android:topLeftRadius="@dimen/dialog_top_radius"
            android:topRightRadius="@dimen/dialog_top_radius" />
        <padding />
    </shape>
    

    dialog_one_button.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="wrap_content"
        android:background="@drawable/dailog_background"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/dialogOneButtonTitle"
            style="@style/TextView.Dialog.Head"
            android:text="Process Completed" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/dialogOneButtonText"
                style="@style/TextView.Dialog.Text"
                android:text="Return the main menu" />
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <Button
                    android:id="@+id/dialogOneButtonOkButton"
                    style="@style/Button.Dialog.Middle"
                    android:text="Ok" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    

    OneButtonDialog.java

    package com.example.sametoztoprak.concept.dialogs;
    
    import android.app.Dialog;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.Window;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.example.sametoztoprak.concept.R;
    import com.example.sametoztoprak.concept.models.DialogFields;
    
    /**
     * Created by sametoztoprak on 26/09/2017.
     */
    
    public class OneButtonDialog extends Dialog implements View.OnClickListener {
    
        private static OneButtonDialog oneButtonDialog;
        private static DialogFields dialogFields;
    
        private Button dialogOneButtonOkButton;
        private TextView dialogOneButtonText;
        private TextView dialogOneButtonTitle;
    
        public OneButtonDialog(AppCompatActivity activity) {
            super(activity);
        }
    
        public static OneButtonDialog getInstance(AppCompatActivity activity, DialogFields dialogFields) {
            OneButtonDialog.dialogFields = dialogFields;
            return oneButtonDialog = (oneButtonDialog == null) ? new OneButtonDialog(activity) : oneButtonDialog;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.dialog_one_button);
            getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    
            dialogOneButtonTitle = (TextView) findViewById(R.id.dialogOneButtonTitle);
            dialogOneButtonText = (TextView) findViewById(R.id.dialogOneButtonText);
            dialogOneButtonOkButton = (Button) findViewById(R.id.dialogOneButtonOkButton);
    
            dialogOneButtonOkButton.setOnClickListener(this);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            dialogOneButtonTitle.setText(dialogFields.getTitle());
            dialogOneButtonText.setText(dialogFields.getText());
            dialogOneButtonOkButton.setText(dialogFields.getOneButton());
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.dialogOneButtonOkButton:
    
                    break;
                default:
                    break;
            }
            dismiss();
        }
    }
    

    0 讨论(0)
  • 2020-11-28 02:21

    If you use Material Components:

    CustomDialog.kt

    class CustomDialog: DialogFragment() {
    
        override fun getTheme() = R.style.RoundedCornersDialog
    
    }
    

    styles.xml

    <style name="RoundedCornersDialog" parent="Theme.MaterialComponents.Dialog">
        <item name="dialogCornerRadius">dimen</item>
    </style>
    
    0 讨论(0)
提交回复
热议问题