2011-12-12 1 views
1

Что я пытаюсь сделать, так это создать настраиваемый диалог, который переопределяет AlertDialog. Что нужно сделать, так это получить текст (как минимум 2 строки), а затем для каждой из этих строк он должен получить больше информации, но я хочу сделать это в пользовательских диалогах. Так что должно случиться, что пользователь может ввести 2 человека на экране активности, а затем для первого человека вы получите настраиваемый диалог, и этот человек может ввести три слова, а затем он перейдет к следующему настраиваемому диалогу (точный тот же макет, который я раздуваю), и второй человек может ввести несколько слов.Как получить значение edittext из пользовательского AlertDialog, где поиск значений не в onClick?

Это мой XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/LinLay_Enter_Words" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 
<TextView 
    android:id="@+id/TextView_AddPlayerWord_Instruction" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="@dimen/help_text_size" 
    android:textStyle="bold"></TextView> 
<EditText 
    android:id="@+id/EditText_Word1" 
    android:layout_height="wrap_content" 
    android:maxLength="20" 
    android:layout_width="match_parent" 
    android:maxLines="1"></EditText> 
<EditText 
    android:id="@+id/EditText_Word2" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:maxLines="1"></EditText> 
<EditText 
    android:id="@+id/EditText_Word3" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:maxLines="1"></EditText> 
</LinearLayout> 

И это часть кода:

protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case NOUN_INPUT_DIALOG_ID: 
     Dialog returnedDialog = initWordDialog(); 
     return(returnedDialog); 
    } 
    return null; 
} 

Он называет initWordDialog():

private Dialog initWordDialog() { 
    LayoutInflater inflater = LayoutInflater.from(this); //(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View dialogLayout = inflater.inflate(R.layout.word_entry_dialog, null); 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    ... 
    TextView v1 = (TextView) dialogLayout.findViewById(R.id.TextView_AddPlayerWord_Instruction); 
    ... 
v1.setText("SomeText"); 

    builder.setView(dialogLayout); 
    builder.setTitle(R.string.enter_word_title); 
    builder.setPositiveButton("Next", onNextSubmit); 
    AlertDialog wordBuilderDialog = builder.create(); 
    return wordBuilderDialog; 
} 

Я думаю, что я пытаюсь найти здесь было в некоторой степени обсуждено: Value of EditText in Custom Dialog Android - Custom Dialog - Can't get text from EditText How to add two edit text fields in an alert dialog Проблема, я считаю, лежит здесь, где все примеры имеют свой onClick в той же функции, что и onCreate. Мои вещи были немного сложнее, и я хотел выделить функции; однако в результате я не могу получить доступ к какой-либо переменной EditText.

Вот моя реализация OnClick:

private DialogInterface.OnClickListener onNextSubmit = new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     if (setPlayerWords()) { 
     ... 
    } 
}; 

Та часть, которая имеет значение, я даже не добраться до той части, где я доступ к edittexts, пока setPlayerWords называется, и это, где это не удается :

public boolean setPlayerWords() { 
    PMGamePlay pmObj = (PMGamePlay) getApplicationContext(); 
    String[] playerWords = new String[pmObj.numberOfWordsPlayersGetToInput()]; 

    //LayoutInflater inflater = LayoutInflater.from(this); 
    //View dialogLayout2 = inflater.inflate(R.layout.word_entry_dialog, null); 
    //setContentView(R.layout.word_entry_dialog); 
    final LinearLayout myLayout = (LinearLayout) findViewById(R.id.LinLay_Enter_Words); 
    final EditText w0 = (EditText) myLayout.findViewById(R.id.EditText_Word1); 
    final EditText w1 = (EditText) myLayout.findViewById(R.id.EditText_Word2); 
    final EditText w2 = (EditText) myLayout.findViewById(R.id.EditText_Word3); 
    String test = w0.getText().toString(); 

    playerWords[0] = w0.getText().toString(); 
    playerWords[1] = w1.getText().toString(); 
    playerWords[2] = w2.getText().toString(); 

    ... 
    return true; 
} 

я сначала пытался повторно накачивания, но это, казалось, сброс и в то время как edittexts не будет нулевым, они были сброшены, чтобы иметь «» в своих значениях. Затем я попытался установитьContentView в свой XML-файл, но это все равно дало мне нулевое значение. Теперь я просто попробую просто получить доступ к linearlayout, а также возвращает нулевое значение. Если я просто попытаюсь получить доступ к edittexts по их идентификатору напрямую, не пройдя сначала его parent linearlayout, он также возвращает нулевое значение.

На данный момент я не уверен, что делать, кроме как перерезать все, что у меня есть в этих отдельных функциях, в один сингл onclick, но я действительно не хочу этого делать. Разве я ничего не могу сделать для доступа к этим edittexts?

Любая помощь была бы принята с благодарностью!

+0

Используйте разные идентификаторы для каждого текста редактирования (уникально для всего приложения). – Noby

+0

Это единственное место, где у меня есть edittexts во всем приложении. В другой раз, когда у меня был вход в активность, я программным образом добавил edittexts. – user1031885

ответ

0

Вы пробовали использовать длинную версию надувного раздувания (синтаксический анализатор XmlPullParser, корневой каталог ViewGroup, boolean attachToRoot)? Я знаю, что если вы не используете этот метод, могут возникнуть некоторые проблемы с его захватом характеристик макета, поэтому может возникнуть проблема. Для группы просмотра вы должны выбрать партерное представление для предупреждения и обычно хотите attachToRoof = false;

+0

Я просто попробовал. \t \t LayoutInflater inflater = LayoutInflater.из этого); \t \t Показать dialogLayout2 = inflater.inflate (R.layout.word_entry_dialog, (ViewGroup) findViewById (R.id.LinLay_Enter_Words), false); но он не работал – user1031885

+0

Что такое макет, который вы передаете как родительский R.id.LinLay_Enter_Words. Попробуйте, возможно, передать контекст активности, я бы подумал, что это будет родительский диалог, но я немного угадываю здесь. – MikeIsrael

Смежные вопросы