自定义AlertDialog创建时的AndroidRuntimeException(AlertDialog内的滚动视图)

自定义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

我想要一个警报对话框,显示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: 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中设置自定义标题,对吗?