我想创建一个自定义对话框如下
我尝试了以下几点。
我创建了AlertDialog的子类。生成器,并使用自定义标题和自定义内容视图,并使用,但结果不是预期的。
另一个尝试是子类DialogFragment和自定义对话框内的onCreateDialog,但结果不是预期的。
然后我尝试使用一个普通的Dialog类。结果并不如预期的那样。
在这三种情况下,问题是当我忽略标题视图时,对话框的大小不是预期的,当我使用标题视图时,结果是在内容视图周围有一个粗边框(这看起来真的很糟糕)。现在我脑子里有两个问题……
我怎样才能做到呢?因为我已经尝试了很多事情,直接的回答会更受欢迎。
在android应用程序中显示错误或警告对话框的最佳方式是什么?
编辑
Android开发者文档建议我们应该使用对话片段或对话框向用户显示错误/警报消息。然而,他们一度说……
提示:如果你想要一个自定义对话框,你可以将一个Activity显示为一个对话框,而不是使用对话框api。简单地创建一个活动,并将其主题设置为manifest元素中的theme . holo . dialog。
这是什么意思?仅仅是为了显示错误消息而使用Activity不是太过分了吗??
创建自定义警报布局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>
它是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>
创建这样的警告对话框布局
<?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();
}
下面是用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()