วิธีสร้างกล่องโต้ตอบที่กำหนดเองด้วยมุมโค้งมนใน Android


133

สิ่งที่ฉันพยายามทำ:ฉันกำลังพยายามสร้างกล่องโต้ตอบที่กำหนดเองใน Android ด้วยมุมโค้งมน

เกิดอะไรขึ้น:ฉันสามารถสร้างไดอะล็อกแบบกำหนดเองได้ แต่ไม่มีมุมโค้งมน ฉันพยายามเพิ่มตัวเลือก แต่ก็ยังไม่สามารถทำมุมโค้งมนได้

ด้านล่างนี้เป็นรหัสของฉันเหมือนกัน:


รหัส 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();

    }

รหัส 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="&quot;I WOULD LIKE TO DISMISS THE VENDOR&quot;"
                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>

คุณกำลังพูดถึงเมนูลอยน้ำ?
Apurva

@Apurva ... ฉันไม่ได้ใช้เมนูลอย ... แต่ฉันกำลังพูดถึงกล่องโต้ตอบการแจ้งเตือน (กำหนดเอง)
Devrath

ฉันถามเกี่ยวกับเมนูลอยน้ำเพราะฉันเห็นป๊อปอัพในมุมกลมเท่านั้น ไม่เคยเห็นกล่องโต้ตอบที่มีมุมโค้งมน
Apurva

คำตอบ:


351

สร้าง xml ในรูปวาดได้โดยพูด 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>

ตั้งเป็นพื้นหลังใน xml เลย์เอาต์ของคุณ

android:background="@drawable/dialog_bg"

ตั้งค่าพื้นหลังของมุมมองรูทของกล่องโต้ตอบเป็นแบบโปร่งใสเนื่องจาก Android วางเค้าโครงกล่องโต้ตอบของคุณไว้ในมุมมองรูทที่ซ่อนมุมในเค้าโครงที่คุณกำหนดเอง

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

1
ปัญหาของวิธีนี้คือพื้นหลังของปุ่มจะโปร่งใสด้วย
Henrique de Sousa

46
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));เป็นสิ่งที่เข้าใจผิดในเธรดอื่น ๆ ส่วนใหญ่! +1
Randika Vishman

เบื้องหลัง TRANSPARENT ไม่แสดงโปรดช่วยฉันด้วย ,,, @ koma yip
Gowthaman M

3
setBackgroundDrawableดูเหมือนจะเลิกใช้แล้ว ... มีทางเลือกอื่นไหม
DarkCygnus

3
เพิ่มdialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));ก่อนsetContentView
Ravi Vaniya

23

คุณต้องดำเนินการดังต่อไปนี้:

  • สร้างพื้นหลังที่มีมุมโค้งมนสำหรับพื้นหลังของกล่องโต้ตอบ:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    
        <solid android:color="#fff" />
    
        <corners
            android:bottomLeftRadius="8dp"
            android:bottomRightRadius="8dp"
            android:topLeftRadius="8dp"
            android:topRightRadius="8dp" />
    
    </shape>
    
  • ตอนนี้ในไฟล์ XML ของ Dialog ของคุณในเค้าโครงรูทใช้พื้นหลังที่มีขอบที่ต้องการ:

    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
    android:background="@drawable/dialog_background"
    
  • สุดท้ายในส่วน java คุณต้องทำสิ่งนี้:

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(layoutResId);
    View v = getWindow().getDecorView();
    v.setBackgroundResource(android.R.color.transparent);
    

มันทำงานได้ดีสำหรับฉัน


1
หากคุณต้องการใช้ค่าเดียวกันสำหรับทุกมุมคุณควรใช้<corners android:radius="8dp"/>มิฉะนั้นคุณจะพบปัญหาในการแสดงผล
Mehran

1
@ เมห์รานจุดดี. ขอบคุณที่ชี้ให้เห็น คุณสามารถแบ่งปันแหล่งที่มาของข้อมูลนี้ได้หรือไม่
SMR

@SMR Path.isConvex is not supportedนี่คือคำเตือนที่คุณมักจะได้รับในเค้าโครงของคุณหากคุณใช้รูปร่างที่มีค่าเท่ากันสำหรับทุกมุม stackoverflow.com/q/34736981/6605907
Mehran


13

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();
    }
}

ใส่คำอธิบายภาพที่นี่


10

ฉันสร้างวิธีใหม่โดยไม่ต้องมีพื้นหลังที่วาดได้คือทำให้มีCardView เป็นพาเรนต์และให้ a app:cardCornerRadius="20dp"แล้วเพิ่มสิ่งนี้ในคลาส javadialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

เป็นอีกวิธีที่จะทำให้ได้


9

หากคุณใช้ส่วนประกอบวัสดุ :

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>

มันเป็นทางออกสำหรับฉันขอบคุณ! ในกรณีของฉันฉันได้เพิ่มข้อความและสีพื้นหลัง: <style name = "RoundedCornersDialog" parent = "Theme.MaterialComponents.Dialog"> <item name = "dialogCornerRadius"> 15dp </item> <item name = "android: background" > @ color / white </item> <item name = "android: textColor"> @ color / black </item> </style>
fvaldivia

6

คุณสามารถใช้รูปร่างสำหรับพื้นหลังเป็น -

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<corners android:radius="10dp" />
<padding android:left="10dp" android:right="10dp"/>
</shape>

ได้ดูในนี้สำหรับรายละเอียด


6

วิธีที่ง่ายที่สุดคือใช้จาก

CardView และการ์ด: 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>

และเมื่อคุณสร้างกล่องโต้ตอบของคุณ

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

โซลูชันนี้ไม่อนุญาตให้แสดงเงาระดับความสูงของ CardView อย่างเต็มที่
laszlo

5

การตั้งค่า

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

จะป้องกันไม่ให้กล่องโต้ตอบสร้างเงา

วิธีแก้คือการใช้

dialog.getWindow().setBackgroundDrawableResource(R.drawable.dialog_rounded_background);

R.drawable.dialog_rounded_background อยู่ที่ไหน

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" android:padding="10dp">
            <solid
                android:color="@color/dialog_bg_color"/>
            <corners
                android:radius="30dp" />
        </shape>
    </item>

</layer-list>

1
โซลูชันที่หรูหราและเรียบง่ายที่สุดที่ทำงานบน API 27, Android 8.1 Oreo
ManuelTS

นี่คือคำตอบที่ถูกต้องในปี 2020 หากคุณยังติดอยู่กับ Theme.AppCompat
barnacle.m

4

สำหรับใครก็ตามที่ชอบทำสิ่งต่างๆใน XML โดยเฉพาะในกรณีที่คุณใช้การดำเนินการองค์ประกอบสถาปัตยกรรมการนำทางเพื่อนำทางไปยังกล่องโต้ตอบ

คุณสามารถใช้ได้:

<style name="DialogStyle" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">

    <!-- dialog_background is drawable shape with corner radius -->
    <item name="android:background">@drawable/dialog_background</item>

    <item name="android:windowBackground">@android:color/transparent</item>
</style>

นี่คือข้อสั้นที่ยอดเยี่ยม! (y)
HasH

4

คุณสามารถใช้ MaterialAlertDialogBuilder เพื่อสร้างกล่องโต้ตอบแบบกำหนดเองที่มีมุมโค้งมน

ขั้นแรกให้สร้างสไตล์สำหรับกล่องโต้ตอบวัสดุดังนี้:

<style name="MyRounded.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.App.CustomDialog.Rounded
    </item>
    <item name="colorSurface">@color/YOUR_COLOR</item>
</style>

<style name="ShapeAppearanceOverlay.App.CustomDialog.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">10dp</item>
</style>

จากนั้นสร้าง Alert Dialog object ในคลาส Java ดังนี้:

AlertDialog alertDialog =  new MaterialAlertDialogBuilder(this,R.style.MyRounded_MaterialComponents_MaterialAlertDialog)  // for fragment you can use getActivity() instead of this 
                    .setView(R.layout.custom_layout) // custom layout is here 
                    .show();

            final EditText editText = alertDialog.findViewById(R.id.custom_layout_text);   // access to text view of custom layout         
            Button btn = alertDialog.findViewById(R.id.custom_layout_btn);

            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Log.d(TAG, "onClick: " + editText.getText().toString());
                }
            });

นั่นคือทั้งหมดที่คุณต้องทำ


วิธีที่ถูกต้องที่สุดอย่าลืมใช้ MaterialAlertDialogBuilder แทน AlertDialog.Builder
Zakhar Rodionov

นั่นคือรถถังที่ยอดเยี่ยม
Gilian Marques

คำตอบอื่น ๆ ทั้งหมดล้าสมัยและไม่น่าเชื่อถือ แต่นี่เป็นคำตอบที่ง่ายและถูกต้องที่สุด! ขอบคุณ
hamza khan

4

ด้วยไลบรารี Androidx และธีมส่วนประกอบวัสดุคุณสามารถแทนที่getTheme()วิธีการ:

import androidx.fragment.app.DialogFragment

class RoundedDialog: DialogFragment() {

    override fun getTheme() = R.style.RoundedCornersDialog

    //....

}

ด้วย:

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

หรือคุณสามารถใช้สิ่งที่MaterialAlertDialogBuilderรวมอยู่ในไลบรารีส่วนประกอบของวัสดุ:

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()
    }

}

ด้วย:

<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>

ใส่คำอธิบายภาพที่นี่

หากคุณไม่ต้องการDialogFragmentเพียงแค่ใช้ไฟล์MaterialAlertDialogBuilder.


3

นี่คือวิธีแก้ปัญหาที่สมบูรณ์หากคุณต้องการควบคุมรัศมีมุมของกล่องโต้ตอบและรักษาเงาระดับความสูง

โต้ตอบ:

class OptionsDialog: DialogFragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View {
    dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    return inflater.inflate(R.layout.dialog_options, container)
}

}

รูปแบบ dialog_options.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<androidx.cardview.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="40dp"
    app:cardElevation="20dp"
    app:cardCornerRadius="12dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        id="@+id/actual_content_goes_here"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>
</FrameLayout>

กุญแจสำคัญคือการรวม CardView ด้วย ViewGroup อื่น (ที่นี่คือ FrameLayout) และตั้งค่าระยะขอบเพื่อสร้างพื้นที่สำหรับเงาระดับความสูง


3

ใน Kotlin ฉันใช้คลาสDoubleButtonDialog Java ที่มีบรรทัด window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))เป็นสิ่งสำคัญ

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()
}

ในเค้าโครงเราสามารถสร้าง 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>

จากนั้นใช้drawable.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="@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>

3

สำหรับระดับ API> = 28 android:dialogCornerRadiusแอตทริบิวต์ใช้ได้ เพื่อรองรับ API เวอร์ชันก่อนหน้าจำเป็นต้องใช้

<style name="RoundedDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="android:windowBackground">@drawable/dialog_bg</item>
    </style>

โดยที่ dialog_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item >
        <shape >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item
        android:left="16dp"
        android:right="16dp">
        <shape>
            <solid
                android:color="@color/white"/>
            <corners
                android:radius="8dp" />

            <padding
                android:left="16dp"
                android:right="16dp" />
        </shape>
    </item>
</layer-list>

รายการเลเยอร์ / รูปร่างโปร่งใสคืออะไร?
Ixx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.