如何创建一个自定义对话框在安卓?

我想创建一个自定义对话框如下

enter image description here

我尝试了以下几点。

  1. 我创建了一个AlertDialog的子类。Builder,并使用了自定义标题和自定义内容视图,但结果并不如预期的那样。

  2. 另一个尝试是子类DialogFragment和自定义对话框内的onCreateDialog,但结果不是预期的。

  3. 然后我尝试使用一个普通的Dialog类。结果并不如预期的那样。

在这三种情况下,问题是当我忽略标题视图时,对话框的大小不是预期的,当我使用标题视图时,结果是在内容视图周围有一个粗边框(这看起来真的很糟糕)。现在我脑子里有两个问题……

  1. 我怎样才能做到呢?因为我已经尝试了很多事情,直接的回答会更受欢迎。

  2. 在android应用程序中显示错误或警告对话框的最佳方式是什么?

<强>编辑 Android开发者文档建议我们应该使用DialogFragments或dialog来向用户显示错误/警报消息。然而,在某一点上,他们说…

提示:如果你想要一个自定义对话框,你可以将一个Activity显示为一个对话框,而不是使用对话框api。简单地创建一个活动,并将其主题设置为manifest元素中的theme . holo . dialog。

这是什么意思?仅仅是为了显示错误消息而使用Activity不是太过分了吗??

795778 次浏览

values -> style.xml中添加下面的主题

<style name="Theme_Dialog" parent="android:Theme.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>

在你的onCreateDialog方法中像这样使用这个主题:

Dialog dialog = new Dialog(FlightBookActivity.this,R.style.Theme_Dialog);

在xml文件中定义你的对话框布局,包括标题栏,并像这样设置xml文件:

dialog.setContentView(R.layout.your_dialog_layout);

这里我创建了一个简单的对话框,像这样:

对话框

custom_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#3E80B4"
android:orientation="vertical" >


<TextView
android:id="@+id/txt_dia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:text="Do you realy want to exit ?"
android:textColor="@android:color/white"
android:textSize="15dp"
android:textStyle="bold"/>
    



<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#3E80B4"
android:orientation="horizontal" >


<Button
android:id="@+id/btn_yes"
android:layout_width="100dp"
android:layout_height="30dp"
android:background="@android:color/white"
android:clickable="true"
android:text="Yes"
android:textColor="#5DBCD2"
android:textStyle="bold" />


<Button
android:id="@+id/btn_no"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginLeft="5dp"
android:background="@android:color/white"
android:clickable="true"
android:text="No"
android:textColor="#5DBCD2"
android:textStyle="bold" />
</LinearLayout>


</LinearLayout>

你必须extends Dialogimplements OnClickListener

public class CustomDialogClass extends Dialog implements
android.view.View.OnClickListener {


public Activity c;
public Dialog d;
public Button yes, no;


public CustomDialogClass(Activity a) {
super(a);
// TODO Auto-generated constructor stub
this.c = a;
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.custom_dialog);
yes = (Button) findViewById(R.id.btn_yes);
no = (Button) findViewById(R.id.btn_no);
yes.setOnClickListener(this);
no.setOnClickListener(this);


}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_yes:
c.finish();
break;
case R.id.btn_no:
dismiss();
break;
default:
break;
}
dismiss();
}
}

如何呼叫对话?

R.id.TXT_Exit:
CustomDialogClass cdd=new CustomDialogClass(Values.this);
cdd.show();

更新

过了很长一段时间,我的一个朋友让我做一个带有透明背景的曲线形状对话框。这里我实现了它。

enter image description here

要制作一个弯曲的形状,你需要创建一个单独的curve_shap.XML,如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android" >


<solid android:color="#000000" />


<stroke
android:width="2dp"
android:color="#ffffff" />


<corners
android:bottomLeftRadius="20dp"
android:bottomRightRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp" />


</shape>

现在,在你的主视图布局中添加这个curve_shap.XML。在我的例子中,我使用了LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="@drawable/curve_shap"
android:orientation="vertical" >
...
</LinearLayout>

这怎么叫?

CustomDialogClass cdd = new CustomDialogClass(MainActivity.this);
cdd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
cdd.show();

我希望这对你有用。

另一种简单的方法。

步骤1)创建一个布局与适当的id。

步骤2)在任何你想要的地方使用以下代码。

LayoutInflater factory = LayoutInflater.from(this);
final View deleteDialogView = factory.inflate(R.layout.mylayout, null);
final AlertDialog deleteDialog = new AlertDialog.Builder(this).create();
deleteDialog.setView(deleteDialogView);
deleteDialogView.findViewById(R.id.yes).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//your business logic
deleteDialog.dismiss();
}
});
deleteDialogView.findViewById(R.id.no).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
deleteDialog.dismiss();
}
});


deleteDialog.show();
public static void showCustomAlertDialog(Context context, String name,
String id, String desc, String fromDate, String toDate,
String resions) {
final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog, null);
alertDialogBuilder.setView(view);
alertDialogBuilder.setCancelable(false);
final AlertDialog dialog = alertDialogBuilder.create();
dialog.show();
txt_empId = (TextView) view.findViewById(R.id.txt_dialog_empcode);
txt_empName = (TextView) view.findViewById(R.id.txt_dialog_empname);
txt_desc = (TextView) view.findViewById(R.id.txt_dialog_desc);
txt_startDate = (TextView) view.findViewById(R.id.txt_dialog_startDate);
txt_resions = (TextView) view.findViewById(R.id.txt_dialog_endDate);
txt_empId.setTypeface(Utils.setLightTypeface(context));
txt_empName.setTypeface(Utils.setLightTypeface(context));
txt_desc.setTypeface(Utils.setLightTypeface(context));
txt_startDate.setTypeface(Utils.setLightTypeface(context));
txt_resions.setTypeface(Utils.setLightTypeface(context));


txt_empId.setText(id);
txt_empName.setText(name);


txt_desc.setText(desc);
txt_startDate.setText(fromDate + "\t to \t" + toDate);
txt_resions.setText(resions);






btn_accept = (Button) view.findViewById(R.id.btn_dialog_accept);
btn_reject = (Button) view.findViewById(R.id.btn_dialog_reject);
btn_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel);
btn_accept.setTypeface(Utils.setBoldTypeface(context));
btn_reject.setTypeface(Utils.setBoldTypeface(context));
btn_cancel.setTypeface(Utils.setBoldTypeface(context));


btn_cancel.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.dismiss();


}
});


}

这是一个示例对话框,使用xml创建。

enter image description here

下面的代码XML只是一个例子,设计或视图在这里实现:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffffff">


<ImageView
android:layout_width="match_parent"
android:layout_height="120dp"
android:id="@+id/a"
android:gravity="center"
android:background="#DA5F6A"
android:src="@drawable/dialog_cross"
android:scaleType="fitCenter" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEXTO"
android:id="@+id/text_dialog"
android:layout_below="@+id/a"
android:layout_marginTop="20dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="20dp"
android:textSize="18sp"
android:textColor="#ff000000"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal" />


<Button
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="OK"
android:id="@+id/btn_dialog"
android:gravity="center_vertical|center_horizontal"
android:layout_below="@+id/text_dialog"
android:layout_marginBottom="20dp"
android:background="@drawable/btn_flat_red_selector"
android:layout_centerHorizontal="true"
android:textColor="#ffffffff" />


</RelativeLayout>

这行代码是drawable的资源:

android:src="@drawable/dialog_cross"
android:background="@drawable/btn_flat_red_selector"

你可以做一个类扩展对话框,也像这样:

public class ViewDialog {


public void showDialog(Activity activity, String msg){
final Dialog dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.dialog);


TextView text = (TextView) dialog.findViewById(R.id.text_dialog);
text.setText(msg);


Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});


dialog.show();


}
}

最后是call的形式,以你的活动为例:

ViewDialog alert = new ViewDialog();
alert.showDialog(getActivity(), "Error de conexión al servidor");

我希望它对你有用。

更新

可绘制的XML对话框:

<shape xmlns:android="schemas.android.com/apk/res/android"> <stroke android:width="2dp" android:color="#FFFFFF" /> <gradient android:angle="180" android:endColor="@color/NaranjaOTTAA" android:startColor="@color/FondoActionBar" /> <corners android:bottomLeftRadius="7dp" android:bottomRightRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp" /> </shape>

此xml由@GastónSaillén提供。

更改背景颜色和文本样式的最简单方法是为android警报对话框自定义主题,如下所示

:只需将下面的代码放入styles.xml:

    <style name="AlertDialogCustom" parent="@android:style/Theme.Dialog">
<item name="android:textColor">#999999</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowTitleStyle">@null</item>
<item name="android:typeface">monospace</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:textSize">@dimen/abc_text_size_medium_material</item>
<item name="android:background">#80ff00ff</item>
</style>

:现在自定义的事情已经完成,现在只应用到你的alertBuilder对象:

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,R.style.AlertDialogCustom);

希望这对你有帮助!

你可以尝试这个简单的Android对话框弹出库来削减混乱的对话框代码。在您的活动中使用它非常简单。 在此之后,您可以在活动中使用此代码来显示dialog

Pop.on(this).with().title(R.string.title).layout(R.layout.custom_pop).show();

其中R.layout.custom_pop是你想要装饰对话框的自定义布局。

创建自定义警报布局custom_aler_update.xml

然后将此代码复制到Activity:

AlertDialog basic_reg;
AlertDialog.Builder builder ;
builder = new AlertDialog.Builder(ct, R.style.AppCompatAlertDialogStyle);
LayoutInflater inflater = ((Activity) ct).getLayoutInflater();
View v = inflater.inflate(R.layout.custom_aler_update, null);
builder.setView(v);
builder.setCancelable(false);
builder.create();
basic_reg = builder.show();

复制此代码到样式:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/primaryTextColor</item>
<item name="android:background">@color/white</item>
</style>

简单先创建一个类

 public class ViewDialog {


public void showDialog(Activity activity, String msg){
final Dialog dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.custom_dialogbox_otp);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));


TextView text = (TextView) dialog.findViewById(R.id.txt_file_path);
text.setText(msg);


Button dialogBtn_cancel = (Button) dialog.findViewById(R.id.btn_cancel);
dialogBtn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//                    Toast.makeText(getApplicationContext(),"Cancel" ,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});


Button dialogBtn_okay = (Button) dialog.findViewById(R.id.btn_okay);
dialogBtn_okay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//                    Toast.makeText(getApplicationContext(),"Okay" ,Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});


dialog.show();
}
}

然后创建custom_dialogbox_otp

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="330dp"
android:layout_height="160dp"
android:background="#00555555"
android:orientation="vertical"
android:padding="5dp"
android:weightSum="100">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/round_layout_otp"
android:orientation="vertical"
android:padding="7dp"
android:weightSum="100">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="60"
android:orientation="horizontal"
android:weightSum="100">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="80"
android:gravity="center">


<ImageView
android:id="@+id/a"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#DA5F6A"
android:gravity="center"
android:scaleType="fitCenter"
android:src="@mipmap/infoonetwo" />


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="20">


<TextView
android:id="@+id/txt_file_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:singleLine="true"
android:text="TEXTO"
android:textColor="#FFFFFF"
android:textSize="17sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="40"
android:background="@drawable/round_layout_white_otp"
android:orientation="vertical"
android:weightSum="100">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="60">


<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Do you wanna Exit..?"
android:textColor="#ff000000"
android:textSize="15dp"
android:textStyle="bold" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="40"
android:orientation="horizontal"
android:weightSum="100">




<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="30dp"
android:layout_weight="50"
android:gravity="center|right">


<Button
android:id="@+id/btn_cancel"
android:layout_width="80dp"
android:layout_height="25dp"
android:background="@drawable/round_button"
android:gravity="center"
android:text="CANCEL"
android:textSize="13dp"
android:textStyle="bold"
android:textColor="#ffffffff" />


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="30dp"
android:layout_weight="50"
android:gravity="center|left">




<Button
android:id="@+id/btn_okay"
android:layout_width="80dp"
android:layout_height="25dp"
android:background="@drawable/round_button"
android:text="OKAY"
android:textSize="13dp"
android:textStyle="bold"
android:textColor="#ffffffff" />


</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

然后在你的可绘制的XML文件下面创建。
对于round_layout_white_otp.xml < /强> < / p >

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >


<!-- <corners android:radius="10dp" /> -->
<corners
android:bottomLeftRadius="18dp"
android:bottomRightRadius="16dp"
android:topLeftRadius="38dp"
android:topRightRadius="36dp" />
<solid android:color="#C0C0C0" />
</shape>

对于round_layout_otp.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >


<!-- <corners android:radius="10dp" /> -->
<corners
android:bottomLeftRadius="18dp"
android:bottomRightRadius="16dp"
android:topLeftRadius="38dp"
android:topRightRadius="38dp" />
<solid android:color="#DA5F6A" />
</shape>

round_button

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >


<!-- <corners android:radius="10dp" /> -->
<corners
android:bottomLeftRadius="7dp"
android:bottomRightRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
<solid android:color="#06A19E" />
</shape>

然后最后使用下面的代码来可视化你的对话框:)

ViewDialog alert = new ViewDialog();
alert.showDialog(ReceivingOTPRegActivity.this, "OTP has been sent to your Mail ");

你的输出:)

enter image description here

答案更新:用于kotlin

  class ViewDialog {
fun showResetPasswordDialog(activity: Activity?) {
val dialog = Dialog(activity!!)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setCancelable(false)
dialog.setContentView(R.layout.resetpass_popup)
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val dialogBtn_remove = dialog.findViewById<TextView>(R.id.txtClose)
dialogBtn_remove.setOnClickListener {
dialog.dismiss()
activity!!.finish()
}
dialog.show()
}
}

你的xml设计,

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="MissingDefaultResource">


<androidx.cardview.widget.CardView
android:layout_width="340dp"
android:layout_height="290dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
app:cardCornerRadius="11dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<ImageView
android:layout_width="61dp"
android:layout_height="61dp"
android:layout_gravity="center"
android:layout_marginTop="12dp"
android:src="@drawable/tickmark"
tools:ignore="ContentDescription"></ImageView>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="22dp"
android:layout_marginTop="18dp"
android:layout_marginRight="12dp"
android:fontFamily="@font/opensans_semibold"
android:text="@string/apasswordreset"
android:textColor="@color/gender_txt"
android:textSize="15dp"
tools:ignore="HardcodedText,RtlHardcoded,SpUsage"></TextView>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="22dp"
android:layout_marginRight="12dp"
android:fontFamily="@font/opensans_semibold"
android:text="@string/toyourmail"
android:textColor="@color/gender_txt"
android:textSize="15dp"
tools:ignore="HardcodedText,RtlHardcoded,SpUsage">




</TextView>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="22dp"
android:layout_marginTop="18dp"
android:layout_marginRight="12dp"
android:fontFamily="@font/opensans_regular"
android:text="@string/followthe"
android:textColor="@color/gender_txt"
android:textSize="14dp"
tools:ignore="HardcodedText,RtlHardcoded,SpUsage"></TextView>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="22dp"
android:layout_marginRight="12dp"
android:fontFamily="@font/opensans_regular"
android:text="@string/inyouremail"
android:textColor="@color/gender_txt"
android:textSize="14dp"
tools:ignore="HardcodedText,RtlHardcoded,SpUsage"></TextView>




<TextView
android:id="@+id/txtClose"
android:layout_width="150dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:layout_marginTop="38dp"
android:background="@drawable/nextbtn"
android:fontFamily="@font/opensans_semibold"
android:gravity="center"
android:text="Close"
android:textColor="@color/white_o"
android:textSize="16dp"
tools:ignore="HardcodedText,RtlHardcoded,SpUsage"></TextView>


</LinearLayout>


</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

现在,你可以打电话了

val alert = ViewDialog()
alert.showResetPasswordDialog(activity)

你的结果,

enter image description here

对话片段是创建自定义警报对话框的最简单方法。按照上面的代码为你的对话框创建一个自定义视图,然后使用对话框片段实现它。在布局文件中添加以下代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="#3E80B4"
android:orientation="vertical">


<TextView
android:id="@+id/txt_dia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:text="Do you realy want to exit ?"
android:textColor="@android:color/white"
android:textSize="15dp"
android:textStyle="bold" />




<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#3E80B4"
android:orientation="horizontal">


<Button
android:id="@+id/btn_yes"
android:layout_width="100dp"
android:layout_height="30dp"
android:background="@android:color/white"
android:clickable="true"
android:text="Yes"
android:textColor="#5DBCD2"
android:textStyle="bold" />


<Button
android:id="@+id/btn_no"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginLeft="5dp"
android:background="@android:color/white"
android:clickable="true"
android:text="No"
android:textColor="#5DBCD2"
android:textStyle="bold" />
</LinearLayout>


</LinearLayout>

创建自定义对话框的最简单方法:

  1. 初始化和显示对话框:

     ViewDialog alertDialoge = new ViewDialog();
    alertDialoge.showDialog(getActivity(), "PUT DIALOG TITLE");
    
  2. Create method:

    public class ViewDialog {
    
    
    public void showDialog(Activity activity, String msg) {
    
    
    final Dialog dialog = new Dialog(activity);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.custom_dialoge_feedback);
    
    
    TextView text = (TextView) dialog.findViewById(R.id.text_dialog_feedback);
    text.setText(msg);
    
    
    Button okButton = (Button) dialog.findViewById(R.id.btn_dialog_feedback);
    Button cancleButton = (Button) dialog.findViewById(R.id.btn_dialog_cancle_feedback);
    final EditText edittext_tv = (EditText) dialog.findViewById(R.id.dialoge_alert_text_feedback);
    
    
    okButton.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View v) {
    //Perfome Action
    }
    });
    cancleButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    dialog.dismiss();
    }
    });
    
    
    dialog.show();
    
    
    }
    }
    
  3. Create layout XML which you want or need.

创建这样的警告对话框布局

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:text="Custom Alert Dialog"
android:layout_height="40dp">
</Button>
</LinearLayout>

在Activity类上添加下面的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


LayoutInflater inflate = LayoutInflater.from(this);
alertView = inflate.inflate(R.layout.your_alert_layout, null);
Button btn= (Button) alertView.findViewById(R.id.btn);


showDialog();
}


public void showDialog(){
Dialog alertDialog = new Dialog(RecognizeConceptsActivity.this);
alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
alertDialog.setContentView(alertView);
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
alertDialog.show();
}

它是Alert Dialog的类,所以你可以从任何活动调用该类来重用代码。

public class MessageOkFragmentDialog extends DialogFragment {
Typeface Lato;
String message = " ";
String title = " ";
int messageID = 0;


public MessageOkFragmentDialog(String message, String title) {
this.message = message;
this.title = title;
}




@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {


AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());


LayoutInflater inflater = getActivity().getLayoutInflater();


View convertview = inflater.inflate(R.layout.dialog_message_ok_box, null);




Constants.overrideFonts(getActivity(), convertview);
Lato = Typeface
.createFromAsset(getActivity().getAssets(), "font/Lato-Regular.ttf");




TextView textmessage = (TextView) convertview
.findViewById(R.id.textView_dialog);


TextView textview_dialog_title = (TextView) convertview.findViewById(R.id.textview_dialog_title);


textmessage.setTypeface(Lato);
textview_dialog_title.setTypeface(Lato);






textmessage.setText(message);
textview_dialog_title.setText(title);






Button button_ok = (Button) convertview
.findViewById(R.id.button_dialog);
button_ok.setTypeface(Lato);


builder.setView(convertview);
button_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dismiss();


}
});




return builder.create();


}
}

相同的Xml文件是:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:gravity="center_vertical|center"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/blue_color"
android:gravity="center_horizontal"
android:orientation="horizontal">


<TextView
android:id="@+id/textview_dialog_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:textColor="@color/white_color"
android:textSize="@dimen/txtSize_Medium" />




</LinearLayout>


<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/txt_white_color" />


<TextView
android:id="@+id/textView_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="@dimen/margin_20"
android:textColor="@color/txt_gray_color"
android:textSize="@dimen/txtSize_small" />


<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/txt_white_color"
android:visibility="gone"/>


<Button
android:id="@+id/button_dialog"
android:layout_width="wrap_content"
android:layout_height="@dimen/margin_40"
android:layout_gravity="center"
android:background="@drawable/circular_blue_button"


android:text="@string/ok"
android:layout_marginTop="5dp"
android:layout_marginBottom="@dimen/margin_10"
android:textColor="@color/txt_white_color"
android:textSize="@dimen/txtSize_small" />
</LinearLayout>


</LinearLayout>

我发现这是显示自定义对话框的最简单方法。

你有布局your_layout.xml

public void showCustomDialog(final Context context) {
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.your_layout, null, false);
findByIds(view);  /*HERE YOU CAN FIND YOU IDS AND SET TEXTS OR BUTTONS*/
((Activity) context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
dialog.setContentView(view);
final Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
window.setBackgroundDrawableResource(R.color.colorTransparent);
window.setGravity(Gravity.CENTER);
dialog.show();
}

我正在发布我正在使用的kotlin代码,它对我来说很好。您还可以为对话框按钮设置单击侦听器。

这是我的XML代码:

layout_custom_alert_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content">


<View
android:id="@+id/view6"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@color/colorPrimary" />


<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/view6"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp">




<TextView
android:id="@+id/txt_alert_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
tools:text="are you sure?"
android:textAlignment="center"
android:textColor="@android:color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />




<Button
android:id="@+id/btn_alert_positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/textView2"
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
tools:text="yes"
android:textColor="@color/colorPrimaryDark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btn_alert_negative"
app:layout_constraintTop_toBottomOf="@+id/txt_alert_title" />


<Button
android:id="@+id/btn_alert_negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
tools:text="no"
android:textColor="@color/colorPrimaryDark"
app:layout_constraintEnd_toStartOf="@+id/btn_alert_positive"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txt_alert_title" />


</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>

mAlertDialog.kt

class mAlertDialog(context: Context) {


private val btn_positive : Button
private val btn_negative : Button
private val txt_alert_title : TextView
private val dialog : AlertDialog
init {
val view = LayoutInflater.from(context).inflate(R.layout.layout_custom_alert_dialog,null)


val dialog_builder = AlertDialog.Builder(context)
dialog_builder.setView(view)


btn_negative = view.findViewById(R.id.btn_alert_negative)
btn_positive = view.findViewById(R.id.btn_alert_positive)
txt_alert_title = view.findViewById(R.id.txt_alert_title)


dialog = dialog_builder.create()
}


fun show()
{
dialog.show()
}


fun setPositiveClickListener(listener :onClickListener)
{
btn_positive.setOnClickListener { v ->
listener.onClick(btn_positive)
dialog.dismiss()
}
}


fun setNegativeClickListener(listener: onClickListener)
{
btn_negative.setOnClickListener { v ->
listener.onClick(btn_negative)
dialog.dismiss()
}
}


fun setPoitiveButtonText(text : String)
{
btn_positive.text = text
}




fun setNegativeButtonText(text : String)
{
btn_negative.text = text
}


fun setAlertTitle(title : String)
{
txt_alert_title.text = title
}
}

用于点击监听器的接口:

onClickListener.kt

interface onClickListener{
fun onClick(view : View)
}

示例使用

val dialog = mAlertDialog(context)
dialog.setNegativeButtonText("no i dont")
dialog.setPoitiveButtonText("yes is do")
dialog.setAlertTitle("do you like this alert dialog?")


dialog.setPositiveClickListener(object : onClickListener {
override fun onClick(view: View) {
Toast.makeText(context, "yes", Toast.LENGTH_SHORT).show()
}
})


dialog.setNegativeClickListener(object : onClickListener {
override fun onClick(view: View) {
Toast.makeText(context, "no", Toast.LENGTH_SHORT).show()
}
})


dialog.show()

我希望,这将帮助你!

创建自定义警报对话框

cumstomDialog.xml

<ImageView
android:id="@+id/icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_margin="5dp"
app:srcCompat="@drawable/error" />


<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/muli_bold"
android:text="Title"
android:layout_marginTop="5dp"
android:textColor="@android:color/black"
android:textSize="15sp" />




<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:fontFamily="@font/muli_regular"
android:text="Message"
android:textColor="@android:color/black"
android:textSize="12dp" />


<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="horizontal">


<Button
android:id="@+id/cancelBTN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_margin="5dp"
android:background="@drawable/bground_radius_button_white"
android:text="No"
android:textColor="@color/black" />


<Button
android:id="@+id/acceptBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_margin="5dp"
android:background="@drawable/bground_radius_button"
android:text="Yes"
android:textColor="@color/white" />
</LinearLayout>

在你的活动上显示你的自定义对话框:

  public void showDialog(String title, String des, int icon) {


final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.custom_dialog);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


Button cancelBTN = dialog.findViewById(R.id.cancelBTN);
Button acceptBTN = dialog.findViewById(R.id.acceptBtn);
TextView tvTitle = dialog.findViewById(R.id.title);
TextView tvDescription = dialog.findViewById(R.id.description);
ImageView ivIcon = dialog.findViewById(R.id.icon);


tvTitle.setText(title);
tvDescription.setText(des);
ivIcon.setImageResource(icon);


cancelBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});


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


}
});


dialog.show();
}

像这样调用:

showDialog("Title", "Message", R.drawable.warning);

导入自定义警报:

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dse_location_list_filter, null);
final Dialog dialog = new Dialog(Acitvity_name.this);
dialog.setContentView(view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.show();

全屏自定义警报对话框类在Kotlin

  1. 创建XML文件,就像创建一个活动一样

  2. 创建AlertDialog自定义类

    class Your_Class(context:Context) : AlertDialog(context){
    
    
    init {
    requestWindowFeature(Window.FEATURE_NO_TITLE)
    setCancelable(false)
    }
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_Layout)
    val window = this.window
    window?.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT)
    
    
    //continue custom code here
    //call dismiss() to close
    }
    }
    
  3. Call the dialog within the activity

    val dialog = Your_Class(this)
    //can set some dialog options here
    dialog.show()
    

Note**: If you do not want your dialog to be full screen, delete the following lines

      val window = this.window
window?.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT)

然后编辑layout_width &将XML文件中顶部布局的layout_height设置为wrap_content或固定DP值。

我通常不建议使用固定的DP,因为你可能希望你的应用能适应多种屏幕尺寸,但如果你保持你的尺寸值足够小,你应该没问题

下面是用kotlin创建自定义视图对话框的代码。 下面是对话框布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="300dp"
android:layout_height="400dp">


<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />




</androidx.constraintlayout.widget.ConstraintLayout>

在文本视图中创建对话框并更新文本

val dialog = Dialog(activity!!)
dialog.setContentView(R.layout.my_dialog_layout)
dialog.tvTitle.text = "Hello World!!"
dialog.show()

下面是一个创建自定义对话框的简单方法。

< em > dialog.xml < / em >

<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<!--  Put your layout content  -->
</LinearLayout>

< em > MainActivity.java < / em >

ShowPopup(){
LayoutInflater li = LayoutInflater.from(this);
View promptsView = li.inflate(R.layout.dialog, null);
android.app.AlertDialog.Builder alertDialogBuilder = new
android.app.AlertDialog.Builder(this);
alertDialogBuilder.setView(promptsView);
alertDialogBuilder.setCancelable(true);
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}

用这段代码正确显示自定义对话框的简单方法

dialog_choose_photo.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical">


<LinearLayout
android:id="@+id/l_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/_5sdp"
android:layout_marginRight="@dimen/_5sdp"
android:layout_marginBottom="@dimen/_5sdp"
android:orientation="vertical">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog_smallround_white"
android:orientation="vertical">


<TextView
android:id="@+id/txt_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="@dimen/_10sdp"
android:paddingBottom="@dimen/_10sdp"
android:text="Take a Photo"
android:textColor="#3080C7"
android:textSize="18sp" />


<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#F1F0F0" />


<TextView
android:id="@+id/txt_gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="@dimen/_10sdp"
android:paddingBottom="@dimen/_10sdp"
android:text="Choose from Gallery"
android:textColor="#3080C7"
android:textSize="18sp" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_5sdp"
android:background="@drawable/bg_dialog_smallround_white"
android:orientation="vertical">


<TextView
android:id="@+id/txt_cancel_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="@dimen/_10sdp"
android:paddingBottom="@dimen/_10sdp"
android:text="Cancel"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
</LinearLayout>




</LinearLayout>




</RelativeLayout>

只要调用这个函数

 public void openPhotoDialog() {
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_choose_photo);
dialog.setCancelable(true);


// Setting dialogview


final Window window = dialog.getWindow();
window.setLayout(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams wlp = window.getAttributes();


wlp.gravity = Gravity.BOTTOM;
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.setDimAmount(0.5f);
window.setAttributes(wlp);




TextView txt_camera = dialog.findViewById(R.id.txt_camera);
TextView txt_gallery = dialog.findViewById(R.id.txt_gallery);
TextView txt_cancel_dialog = dialog.findViewById(R.id.txt_cancel_dialog);


txt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.dismiss();
}
});
txt_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.dismiss();
}
});
txt_cancel_dialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.dismiss();
}
});


dialog.show();


}

Bg_dialog_smallround_white.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/_5sdp" />
</shape>