2

是否可以在警报对话框中设置可变数量的文本编辑?我尝试动态填充一些容器视图,例如 StackView 或 LinearLayout,但据说在 AdapterView(异常)中不支持方法 addView。解决方案是什么?
补充:
我想从动态信息中构建alertdialog。

AlertDialog.Builder alert = new AlertDialog.Builder(context);

现在我可以像这样设置它的视图:

alert.setView(v);

但是 v 元素只能是 TextView 或 EditText 这样简单的东西。如果我想创建一些可能包含可变数量元素的容器视图,例如 2 个文本视图和 3 个编辑文本,该怎么办?我怎样才能做到这一点?现在我只是创建单独的布局文件并用它来膨胀视图,这不是一个解决方案。我能做些什么?

4

5 回答 5

0

为什么需要可变数量的TextViews?您可以使用一个来显示多行。如果您需要更复杂的东西,您可以使用主题创建自己的类似对话框的活动@android:style/Theme.Dialog,限制其尺寸,使其不覆盖整个显示区域。

更新:

下面是一个如何做一个类似对话框的子活动的例子:

:: ComplexDialog.java

public class ComplexDialog extends Activity {
    ...regular Activity stuff...

    protected void onCreate(Bundle savedInstanceState) {
        ...get extras from the intent, set up the layout, handle input, etc...

        LinearLayout dialogLayout = (LinearLayout) findViewById(R.id.dialogLayout);
        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth() > 640 ? 640 : (int) (display.getWidth() * 0.80);
        dialogLayout.setMinimumWidth(width);
        dialogLayout.invalidate();

        ...more regular stuff...
};

:: AndroidManifest.xml

<activity android:name=".ComplexDialog" android:theme="@android:style/Theme.Dialog"></activity>
于 2011-10-12T06:47:48.360 回答
0

添加 aLinearLayout应该可以正常工作:

#onCreate(Bundle)

...
...
/*LinearLayout*/ mDlgLayout = new LinearLayout(this);
mDlgLayout.setOrientation(LinearLayout.VERTICAL);

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Some title");
alert.setView(mDlgLayout);
alert.setNeutralButton("Regenerate", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dlg, int which) {
            // onClick will dismiss the dialog, just posting delayed
            // to pop up the dialog again & change the layout.
            mDlgLayout.postDelayed(new Runnable() {
                    public void run() {
                        alterDlgLayout();
                    }
                }, 200L);
        }
    });
/*AlertDialog*/ mDlg = alert.create();
...
...

#alterDlgLayout()

void alterDlgLayout() {
    mDlgLayout.removeAllViews();
    Random rnd = new Random(System.currentTimeMillis());
    int n = rnd.nextInt(3) + 1;
    for (int i = 0; i < n; i++) {
        EditText txt = new EditText(this);
        txt.setHint("Some hint" + rnd.nextInt(100));
        mDlgLayout.addView(txt);
    }
    mDlgLayout.invalidate();
    mDlg.show();
}

#onResume()

alterDlgLayout();

#onPause()

mDlg.dismiss();
于 2011-10-12T08:45:48.957 回答
0

这是下面的链接是用于对话框的静态布局

http://knol.google.com/k/thiyagaraaj-mp/custom-dialog-box-popup-using-layout-in/1lfp8o9xxpx13/171#

如果要添加动态布局或编辑现有布局,则可以通过方法获得

RelativeLayout myMainLayout= (RelativeLayout)myDialog.findViewById(R.id.myMainLayout);

并通过在 java 中创建它们并使用 addView() 方法将您选择的视图添加到主布局中。

myMainLayout.addView(yourChildView);
于 2011-10-19T05:45:18.683 回答
0

最简单的方法是动态地膨胀视图,在您的对话框创建方法中,将此代码用于构建对话框:

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Some title");
ViewGroup final mainLayout = getLayoutInflater().inflate(R.layout.the_custom_holder);
final EditText[] editors = new EditText[requiredItemCount];
for (int i = 0; i < requiredItemCount; i++) {
   View inputter = getLayoutInflater().inflate(R.layout.the_custom_line);
   editors[i] = inputter.findViewById(R.id.editorId);
}

alert.setPositiveButton(R.string.stringHelptextButtonOK,
   new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int whichButton) {
      // Accessing one of the edittexts
      String requiredText = editors[3].getText().toString();
      // TODO Do stuff with result
   }
alert.setView(mDlgLayout);
alert.create().show();
于 2011-10-19T06:21:00.177 回答
0

用户查看对话框时 EditText 的数量是否在变化,或者到那时数量是否已修复?如果它是固定的并且只是不时变化,您可以为它们中的每一个构建自己的布局 xml,然后使用 switch 语句决定要在对话框中显示哪个布局 xml。

可以使用以下代码显示自定义警报对话框:

// This example shows how to add a custom layout to an AlertDialog
            LayoutInflater factory = LayoutInflater.from(this);
            final View textEntryView = factory.inflate(
                    R.layout.helpdialog_main, null);
            return new AlertDialog.Builder(Main.this)
                    .setView(textEntryView)
                    .setPositiveButton(R.string.stringHelptextButtonOK,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {

                                    // Popup is closed automatically, nothing
                                    // needs to be done here
                                }
                            }).create();
于 2011-10-12T07:44:12.627 回答