自定义AlertDialog创建时的AndroidRuntimeException(AlertDialog内的滚动视图)
我想要一个警报对话框,显示TextView和EditText的垂直线性布局,每对一行。对的数量每次都会变化,最多可以达到15-20个,因此将线性布局放在滚动视图中,但我得到以下例外自定义AlertDialog创建时的AndroidRuntimeException(AlertDialog内的滚动视图),android,xml,Android,Xml,我想要一个警报对话框,显示TextView和EditText的垂直线性布局,每对一行。对的数量每次都会变化,最多可以达到15-20个,因此将线性布局放在滚动视图中,但我得到以下例外 01-04 08:25:16.679: E/AndroidRuntime(7199): FATAL EXCEPTION: main 01-04 08:25:16.679: E/AndroidRuntime(7199): android.util.AndroidRuntimeException: requestFeat
01-04 08:25:16.679: E/AndroidRuntime(7199): FATAL EXCEPTION: main
01-04 08:25:16.679: E/AndroidRuntime(7199): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-04 08:25:16.679: E/AndroidRuntime(7199): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229)
01-04 08:25:16.679: E/AndroidRuntime(7199): at com.android.internal.app.AlertController.installContent(AlertController.java:234)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.app.AlertDialog.onCreate(AlertDialog.java:337)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.app.Dialog.dispatchOnCreate(Dialog.java:355)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.app.Dialog.show(Dialog.java:260)
01-04 08:25:16.679: E/AndroidRuntime(7199): at edu.vesit.ams.ChoosePresetsManipAbsenteesActivity$12.onClick(ChoosePresetsManipAbsenteesActivity.java:703)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.view.View.performClick(View.java:4204)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.view.View$PerformClick.run(View.java:17360)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.os.Handler.handleCallback(Handler.java:725)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.os.Handler.dispatchMessage(Handler.java:92)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.os.Looper.loop(Looper.java:137)
01-04 08:25:16.679: E/AndroidRuntime(7199): at android.app.ActivityThread.main(ActivityThread.java:5237)
01-04 08:25:16.679: E/AndroidRuntime(7199): at java.lang.reflect.Method.invokeNative(Native Method)
01-04 08:25:16.679: E/AndroidRuntime(7199): at java.lang.reflect.Method.invoke(Method.java:511)
01-04 08:25:16.679: E/AndroidRuntime(7199): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
01-04 08:25:16.679: E/AndroidRuntime(7199): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
01-04 08:25:16.679: E/AndroidRuntime(7199): at dalvik.system.NativeStart.main(Native Method)
对于代码
@Override
public void onClick(View v)
{
if(editTextRollNumsMedicalLeave.getText().toString().trim().equals("") || editTextRollNumsMedicalLeave.getText().toString().trim().equals(null))
Toast.makeText(ChoosePresetsManipAbsenteesActivity.this, "Enter atleast 1 roll number 1st", Toast.LENGTH_SHORT).show();
else
{
for(String rn:editTextRollNumsMedicalLeave.getText().toString().trim().split("[,]"))
medicalReasons.put(Integer.parseInt(rn), "None specified");
final TextView txtViewsShowRollNums[] = new TextView[medicalReasons.size()];
final EditText editTextsGetReasons[] = new EditText[medicalReasons.size()];
AlertDialog.Builder builder = new AlertDialog.Builder(ChoosePresetsManipAbsenteesActivity.this);
builder.setTitle("Enter Medical Leave Reasons");
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.setPositiveButton("Save", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
for(int i=0;i<txtViewsShowRollNums.length;i++)
{
String medicalReason = editTextsGetReasons[i].getText().toString().trim();
medicalReasons.put(Integer.parseInt(txtViewsShowRollNums[i].getText().toString()), medicalReason.equals("")?"None Specified":medicalReason);
}
}
});
LinearLayout layout = new LinearLayout(ChoosePresetsManipAbsenteesActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setWeightSum(1.0F);
int i = 0;
for(Map.Entry<Integer, String> entry:medicalReasons.entrySet())
{
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2F);
txtViewsShowRollNums[i] = new TextView(ChoosePresetsManipAbsenteesActivity.this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i], layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8F);
editTextsGetReasons[i] = new EditText(ChoosePresetsManipAbsenteesActivity.this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey()));
layout.addView(editTextsGetReasons[i], layoutParams2);
i++;
}
builder.setView(layout);
AlertDialog alertDialogGetMedicalReasons = builder.create();
alertDialogGetMedicalReasons.setContentView(R.layout.medical_other_reasons_input_dialog);
alertDialogGetMedicalReasons.show();
}
}
编辑2:设置正按钮后的代码
LayoutInflater inflater=
(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ScrollView mainLayout =
(ScrollView)inflater.inflate(R.layout.medical_other_reasons_input_dialog, null);
LinearLayout layout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setWeightSum(1.0F);
int i = 0;
for(Map.Entry<Integer, String> entry:medicalReasons.entrySet())
{
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2F);
txtViewsShowRollNums[i] = new TextView(ChoosePresetsManipAttendanceActivity.this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i], layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8F);
editTextsGetReasons[i] = new EditText(ChoosePresetsManipAttendanceActivity.this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey()));
layout.addView(editTextsGetReasons[i], layoutParams2);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical_other_reasons_input_dialog);
mainLayout.addView(layout);
builder.setView(mainLayout);
AlertDialog alertDialogGetMedicalReasons = builder.create();
alertDialogGetMedicalReasons.show();
}
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ScrollView scrollView = (ScrollView)inflater.inflate(R.layout.medical_other_reasons_input_dialog, null);
LinearLayout wrappingLinearLayout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
wrappingLinearLayout.setOrientation(LinearLayout.VERTICAL);
int i = 0;
for(Map.Entry<Integer, String> entry:medicalReasons.entrySet())
{
LinearLayout layout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setWeightSum(1.0F);
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2F);
txtViewsShowRollNums[i] = new TextView(ChoosePresetsManipAttendanceActivity.this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i], layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8F);
editTextsGetReasons[i] = new EditText(ChoosePresetsManipAttendanceActivity.this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey()));
layout.addView(editTextsGetReasons[i], layoutParams2);
wrappingLinearLayout.addView(layout);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical_other_reasons_input_dialog);
scrollView.addView(wrappingLinearLayout);
builder.setView(scrollView);
AlertDialog alertDialogGetMedicalReasons = builder.create();
alertDialogGetMedicalReasons.show();
flater充气机=
(LayoutInflater)getSystemService(Context.LAYOUT\u flater\u SERVICE);
ScrollView主布局=
(滚动视图)充气器。充气(R.layout.medical\u其他原因\u输入\u对话框,空);
LinearLayout layout=新建LinearLayout(选择重置模式和活动。此选项);
布局。设置方向(线性布局。垂直);
布局。设置权重总和(1.0F);
int i=0;
for(Map.Entry:medicalReasons.entrySet())
{
LinearLayout.LayoutParams layoutParams1=新的LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_内容,0.2F);
txtViewsShowRollNums[i]=新建文本视图(选择重置模式和活动。this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i],layoutParams1);
LinearLayout.LayoutParams LayoutParams 2=新的LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_内容,0.8F);
editTextsGetReasons[i]=新的EditText(选择重置模式激活。this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey());
layout.addView(editTextsGetReasons[i],layoutParams2);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical\u其他原因\u输入\u对话框);
mainLayout.addView(布局);
builder.setView(主布局);
AlertDialog alertDialogGetMedicalReasons=builder.create();
alertDialogGetMedicalReasons.show();
}
对不起,如果是错误的方式,只是谷歌和尝试。。在动态添加视图方面没有太多经验。。我确实得到了上面代码的滚动视图(我看到了滚动条),但是里面没有EditText和TextView
最终编辑3:设置正按钮后
LayoutInflater inflater=
(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ScrollView mainLayout =
(ScrollView)inflater.inflate(R.layout.medical_other_reasons_input_dialog, null);
LinearLayout layout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setWeightSum(1.0F);
int i = 0;
for(Map.Entry<Integer, String> entry:medicalReasons.entrySet())
{
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2F);
txtViewsShowRollNums[i] = new TextView(ChoosePresetsManipAttendanceActivity.this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i], layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8F);
editTextsGetReasons[i] = new EditText(ChoosePresetsManipAttendanceActivity.this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey()));
layout.addView(editTextsGetReasons[i], layoutParams2);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical_other_reasons_input_dialog);
mainLayout.addView(layout);
builder.setView(mainLayout);
AlertDialog alertDialogGetMedicalReasons = builder.create();
alertDialogGetMedicalReasons.show();
}
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ScrollView scrollView = (ScrollView)inflater.inflate(R.layout.medical_other_reasons_input_dialog, null);
LinearLayout wrappingLinearLayout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
wrappingLinearLayout.setOrientation(LinearLayout.VERTICAL);
int i = 0;
for(Map.Entry<Integer, String> entry:medicalReasons.entrySet())
{
LinearLayout layout = new LinearLayout(ChoosePresetsManipAttendanceActivity.this);
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setWeightSum(1.0F);
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2F);
txtViewsShowRollNums[i] = new TextView(ChoosePresetsManipAttendanceActivity.this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i], layoutParams1);
LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8F);
editTextsGetReasons[i] = new EditText(ChoosePresetsManipAttendanceActivity.this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey()));
layout.addView(editTextsGetReasons[i], layoutParams2);
wrappingLinearLayout.addView(layout);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical_other_reasons_input_dialog);
scrollView.addView(wrappingLinearLayout);
builder.setView(scrollView);
AlertDialog alertDialogGetMedicalReasons = builder.create();
alertDialogGetMedicalReasons.show();
LayoutInflater充气器=(LayoutInflater)getSystemService(Context.LAYOUT\u充气器\u SERVICE);
ScrollView ScrollView=(ScrollView)充气器。充气(R.layout.medical\u其他原因\u输入\u对话框,空);
LinearLayout wrappingLinearLayout=新的LinearLayout(选择重置模式活动。此选项);
包装线布局。设置方向(线性布局。垂直);
int i=0;
for(Map.Entry:medicalReasons.entrySet())
{
LinearLayout layout=新建LinearLayout(选择重置模式和活动。此选项);
布局。设置方向(线性布局。水平);
布局。设置权重总和(1.0F);
LinearLayout.LayoutParams layoutParams1=新的LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_内容,0.2F);
txtViewsShowRollNums[i]=新建文本视图(选择重置模式和活动。this);
txtViewsShowRollNums[i].setText(entry.getKey().toString());
layout.addView(txtViewsShowRollNums[i],layoutParams1);
LinearLayout.LayoutParams LayoutParams 2=新的LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_内容,0.8F);
editTextsGetReasons[i]=新的EditText(选择重置模式激活。this);
editTextsGetReasons[i].setHint(medicalReasons.get(entry.getKey());
layout.addView(editTextsGetReasons[i],layoutParams2);
wrappingLinearLayout.addView(布局);
i++;
}
//alertDialogGetMedicalReasons.setContentView(R.layout.medical\u其他原因\u输入\u对话框);
scrollView.addView(wrappingLinearLayout);
builder.setView(滚动视图);
AlertDialog alertDialogGetMedicalReasons=builder.create();
alertDialogGetMedicalReasons.show();
因为正如错误所述,您正在尝试创建警报对话框
AlertDialog alertDialogGetMedicalReasons = builder.create();
在尝试设置视图之前
alertDialogGetMedicalReasons.setView(layout);
因此,您需要先调用setView()
,然后才能create()
将此行放入
requestWindowFeature(Window. FEATURE_CUSTOM_TITLE );
以前,
AlertDialog.Builder builder = new AlertDialog.Builder(ChoosePresetsManipAbsenteesActivity.this);
builder.setTitle("Enter Medical Leave Reasons");
在您的情况下,它可能会引发异常。。因为您正在尝试设置alertbuilderdialog的标题。。可能需要windowfeature来设置标题。。检查后让我知道..这是否也会将我的线性布局封装在scrollview中?是的,可能是,但我不清楚您到底在做什么。您正在调用
setContentView()
,然后调用setView()
。无论如何,您应该能够移动AlertDialog alertDialogGetMedicalReasons=builder.create()代码>到正上方的alertDialogGetMedicalReasons.show()
我认为will workcontent视图具有scrollview xml文件引用,而我尝试使用SetView设置线性布局。您没有按照我所说的方式进行更改,请不要更改原始帖子,但您可以添加到其中。否则,它将变得混乱,对其他人来说毫无价值。将builder.create()
code移动到.show()
line.ohh ok.的正上方。。但是如何设置scrollview引用呢。。生成器没有setContentView()?请在长注释中回答!:PI没有使用任何自定义标题。。那么是否需要该行呢?builder.setTitle(“输入病假原因”);此行用于在aler builder中设置自定义标题,对吗?