我想创建一个自定义对话框如下
我尝试了以下几点。
我创建了AlertDialog的子类。生成器,并使用自定义标题和自定义内容视图,并使用,但结果不是预期的。
另一个尝试是子类DialogFragment和自定义对话框内的onCreateDialog,但结果不是预期的。
然后我尝试使用一个普通的Dialog类。结果并不如预期的那样。
在这三种情况下,问题是当我忽略标题视图时,对话框的大小不是预期的,当我使用标题视图时,结果是在内容视图周围有一个粗边框(这看起来真的很糟糕)。现在我脑子里有两个问题……
我怎样才能做到呢?因为我已经尝试了很多事情,直接的回答会更受欢迎。
在android应用程序中显示错误或警告对话框的最佳方式是什么?
编辑
Android开发者文档建议我们应该使用对话片段或对话框向用户显示错误/警报消息。然而,他们一度说……
提示:如果你想要一个自定义对话框,你可以将一个Activity显示为一个对话框,而不是使用对话框api。简单地创建一个活动,并将其主题设置为manifest元素中的theme . holo . dialog。
这是什么意思?仅仅是为了显示错误消息而使用Activity不是太过分了吗??
它是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>
创建自定义警报对话框
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();
}
像这样调用:
“标题”、“信息”、“警告”;
全屏自定义警报对话框类在Kotlin
Create XML file, same as you would an activity
Create AlertDialog custom class
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
}
}
Call the dialog within the activity
val dialog = Your_Class(this)
//can set some dialog options here
dialog.show()
注意**:如果您不希望对话框全屏显示,请删除以下行
val window = this.window
window?.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT)
然后在XML文件中编辑顶部布局的layout_width和layout_height,使其为wrap_content或固定的DP值。
我通常不建议使用固定的DP,因为你可能希望你的应用能适应多种屏幕尺寸,但如果你保持你的尺寸值足够小,你应该没问题
更改背景颜色和文本样式的最简单方法是为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);
希望这对你有帮助!