Переменное количество textedits в алертиддиалоге в андроиде?

Можно ли установить переменное количество textedits в alerttdialog? Я попытался динамически заполнить некоторые контейнерные представления, такие как StackView или LinearLayout, но говорят, что метод addView не поддерживается в AdapterView(исключение). Какое решение?
Добавлено:
Я хочу построить алертилдиалог из динамической информации.

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

Теперь я могу установить его вид так:

alert.setView(v);

но элемент v может быть простым, например TextView или EditText. Что если я захочу создать контейнерное представление, которое может содержать переменное количество элементов, например, 2 textviews и 3 edittexts? Как я могу это сделать? Теперь я просто создаю отдельный файл макета и раздуваю представление, но это не решение. Что я могу сделать?

5 ответов

Зачем вам нужно переменное число 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>

Добавление LinearLayout должно работать просто отлично:

В #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();

Меняется ли число EditTexts, пока пользователь просматривает диалоговое окно, или к тому времени число фиксируется? Если он фиксированный и меняется только время от времени, вы можете создать собственный 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();

Самый простой способ - динамически раздувать представления. В вашем методе создания диалога поместите этот код для построения Dialog:

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();

Вот ссылка ниже для статического макета диалогового окна

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

если вы хотите добавить динамический макет или отредактировать существующий макет, то вы можете получить это методом

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

и добавьте представление по вашему выбору в основной макет, создав их в java и используя метод addView().

myMainLayout.addView(yourChildView);
Другие вопросы по тегам