我正在尝试使用EditText
对象创建警告对话框。我需要以编程方式设置EditText
的初始文本。这就是我所拥有的。
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
alertDialog.setContentView(inflater.inflate(R.layout.alert_label_editor, null));
EditText editText = (EditText) findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();
我需要更改哪些内容才能拥有有效的EditText
对象?
[编辑]
因此,user370305和其他人指出我应该使用alertDialog.findViewById(R.id.label_field);
不幸的是,这里还有另一个问题。显然,在AlertDialog
上设置内容视图会导致程序在运行时崩溃。您必须在构建器上设置它。
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();
不幸的是,当您执行此操作时,alertDialog.findViewById(R.id.label_field);
现在会返回null
。
[/编辑]
答案 0 :(得分:205)
editText
是alertDialog
布局的一部分,所以只需参考editText
alertDialog
EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);
更新:
因为在代码行中dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));
inflater
为空。
更新您的代码,如下所示,并尝试了解每个代码行
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.alert_label_editor, null);
dialogBuilder.setView(dialogView);
EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
editText.setText("test label");
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();
更新2:
当您使用Inflater创建的View对象更新UI组件时,您可以直接使用setView(int layourResId)
类的AlertDialog.Builder
方法,该方法可从API 21及以后版本获得。
答案 1 :(得分:22)
使用此
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
// Get the layout inflater
LayoutInflater inflater = (activity).getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the
// dialog layout
builder.setTitle(title);
builder.setCancelable(false);
builder.setIcon(R.drawable.galleryalart);
builder.setView(inflater.inflate(R.layout.dialogue, null))
// Add action buttons
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
}
}
});
builder.create();
builder.show();
答案 2 :(得分:5)
你可以写:
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
LayoutInflater inflater = this.getLayoutInflater();
View dialogView= inflater.inflate(R.layout.alert_label_editor, null);
dialogBuilder.setView(dialogView);
Button button = (Button)dialogView.findViewById(R.id.btnName);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Commond here......
}
});
EditText editText = (EditText)
dialogView.findViewById(R.id.label_field);
editText.setText("test label");
dialogBuilder.create().show();
答案 3 :(得分:1)
改变这个:
EditText editText = (EditText) findViewById(R.id.label_field);
到此:
EditText editText = (EditText) v.findViewById(R.id.label_field);
答案 4 :(得分:1)
如果有人想要它在Kotlin:
val dialogBuilder = AlertDialog.Builder(this)
// ...Irrelevant code for customizing the buttons and title
val dialogView = layoutInflater.inflate(R.layout.alert_label_editor, null)
dialogBuilder.setView(dialogView)
val editText = dialogView.findViewById(R.id.label_field)
editText.setText("test label")
val alertDialog = dialogBuilder.create()
alertDialog.show()
重新发布@user370305's回答。
答案 5 :(得分:0)
View v=inflater.inflate(R.layout.alert_label_editor, null);
alertDialog.setContentView(v);
EditText editText = (EditText)v.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();
答案 6 :(得分:0)
/**
* Shows confirmation dialog about signing in.
*/
private void startAuthDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();
alertDialog.getWindow().setLayout(800, 1400);
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.auth_dialog, null);
alertDialog.getWindow().setContentView(dialogView);
EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
editText.setText("test label");
}
答案 7 :(得分:0)
步骤1。创建文件activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".MainActivity"
android:background="#ecd235"
>
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Simple TextView"
android:textSize="35dp"
/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Apply Red Color Text"
android:layout_below="@id/tv_message"
/>
</RelativeLayout>
第2步。androidalertdialog_custom_view.xml中的自定义布局alertDialog
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/dialog_rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".MainActivity"
android:background="#c9d4f6"
>
<TextView
android:id="@+id/dialog_titile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Confirm the change."
android:padding="5dp"
android:background="#a2abcd"
android:textSize="15dp"
/>
<TextView
android:id="@+id/dialog_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Want to change the text color?"
android:padding="15dp"
android:layout_below="@id/dialog_titile"
/>
<Button
android:id="@+id/dialog_neutral_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel"
android:layout_below="@id/dialog_tv"
android:background="@drawable/button_bg"
/>
<Button
android:id="@+id/dialog_positive_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Yes"
android:layout_alignBaseline="@id/dialog_neutral_btn"
android:layout_alignParentRight="true"
android:background="@drawable/button_bg"
/>
<Button
android:id="@+id/dialog_negative_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No"
android:layout_toLeftOf="@id/dialog_positive_btn"
android:layout_alignBaseline="@id/dialog_neutral_btn"
android:background="@drawable/button_bg"
android:layout_marginRight="3dp"
/>
</RelativeLayout>
第3步。创建一个文件res / drawable / button_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#d2ddff"/>
</shape>
</item>
</selector>
第4步。创建一个类MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get reference of widgets from XML layout
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
final TextView tv_message = (TextView) findViewById(R.id.tv_message);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Build an AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
LayoutInflater inflater = getLayoutInflater();
View dialogView = inflater.inflate(R.layout.alertdialog_custom_view,null);
// Set the custom layout as alert dialog view
builder.setView(dialogView);
// Get the custom alert dialog view widgets reference
Button btn_positive = (Button) dialogView.findViewById(R.id.dialog_positive_btn);
Button btn_negative = (Button) dialogView.findViewById(R.id.dialog_negative_btn);
Button btn_neutral = (Button) dialogView.findViewById(R.id.dialog_neutral_btn);
// Create the alert dialog
final AlertDialog dialog = builder.create();
// Set positive/yes button click listener
btn_positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Dismiss the alert dialog
dialog.cancel();
tv_message.setText("Yes button clicked");
// Set the TextView text color red
tv_message.setTextColor(Color.RED);
}
});
// Set negative/no button click listener
btn_negative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Dismiss the alert dialog
dialog.cancel();
tv_message.setText("No button clicked");
}
});
// Set cancel/neutral button click listener
btn_neutral.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Dismiss/cancel the alert dialog
dialog.cancel();
tv_message.setText("Cancel button clicked");
}
});
// Display the custom alert dialog on interface
dialog.show();
}
});
}
}
链接资源:https://code-android-example.blogspot.com/2019/12/how-to-custom-layout-alertdialog-android.html