Переменное количество 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 ответов
Зачем вам нужно переменное число TextView
s? Вы можете использовать одну для отображения нескольких строк. Если вам нужно что-то более сложное, вы можете создать свое собственное диалоговое действие с темой @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);