2013-05-24 3 views
2

Я, похоже, не могу обернуть голову вокруг пользовательских диалогов. Я пробовал много вариантов, но пока не повезло.Невозможно получить EditText в пользовательском диалоговом окне

Это мой текущий XML для диалога:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/edit_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:orientation="vertical" > 

    <TextView 
      android:id="@+id/Word" 
      android:text="Word?" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="left|center_vertical"/> 

    <EditText 
      android:layout_height="100dp" 
      android:layout_width="match_parent" 
      android:id="@+id/lookupWordEdit" 
      android:inputType="text"/> 
</RelativeLayout> 

А вот код:

public class LookupWordDialogFragment extends DialogFragment { 
    private EditText mEditText; 

    public LookupWordDialogFragment() { 
     // Empty constructor required for DialogFragment 
    } 

    public interface LookupWordDialogListener { 
     void onFinishEditDialog(String inputText); 
    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     // Get the layout inflater 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     final EditText lookupWordEdit = (EditText)getActivity().findViewById(R.id.lookupWordEdit); 

     // Inflate and set the layout for the dialog 
     // Pass null as the parent view because its going in the dialog layout 
     builder.setView(inflater.inflate(R.layout.dialog_lookupword, null)) 
       // Add action buttons 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       // Return input text to activity 

       LayoutInflater inflater = getActivity().getLayoutInflater(); 
       final EditText lookupWordEdit = (EditText)getActivity().findViewById(R.id.lookupWordEdit); 

       LookupWordDialogListener activity = (LookupWordDialogListener) getActivity(); 
       activity.onFinishEditDialog(lookupWordEdit.getText().toString()); 
      } 
     }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         LookupWordDialogFragment.this.getDialog().cancel(); 
        } 
       }); 
     return builder.create(); 
    } 
} 

в настоящее время код падает с нулевым исключением указателя на этой линии:

activity.onFinishEditDialog(lookupWordEdit.getText().toString()); 

Я подозреваю, что Im не правильно захватил поискWordEdit. Диалог очень прост. Как я должен захватить введенный текст, когда пользователь нажал кнопку «ОК»?

Спасибо!

+0

использования этого inflater.findViewById (R.id.lookupWordEdit); для инициализации edittext – Raghunandan

ответ

2

Вы должны изменить этот

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_lookupword, null); 
builder.setView(view); 

Теперь здесь вы редко используете EditText внутри AlertDialog

EditText lookupWordEdit = (EditText)view.findViewById(R.id.lookupWordEdit); 
+0

Спасибо, это тот, который работал для меня. – kurisukun

0

lookupWordEdit EditText находится внутри AlertDialog Layout вместо DialogFragment макета так что вам нужно будет использовать тот же вид экземпляра который вы передаете в setView из AlertDialog для доступа к EditText из AlertDialog, сделайте это как:

LayoutInflater inflater = LayoutInflater.from(getActivity()); 
View dialogview = inflater.inflate(R.layout.dialog_lookupword, null); 
// now pass dialogview to setView of Dialog 
builder.setView(dialogview); 
..... 

теперь используют dialogview для инициализации EditText из dialog_lookupword компоновки, как:

EditText lookupWordEdit = (EditText)dialogview.findViewById(R.id.lookupWordEdit); 
+1

в дополнение к ответу, пожалуйста, проверьте ссылку http://stackoverflow.com/questions/16711427/can-we-findviewbyid-of-an-element-not-available-in-the-main-activity/16711474#16711474. Вы можете найти идентификатор текущей иерархии представлений. В вашем случае это диалоговое окно предупреждения. используйте то же самое для findviewbyid вместо getactivity() – Raghunandan

+0

Я пробовал это только сейчас, но он разбился при создании диалога. Но спасибо, я думаю, что я, должно быть, сделал что-то не так. – kurisukun

+0

@kurisukun: есть ли у вас какие-либо ошибки? –