Как вводить текст с помощью DialogFragment в Android?

Я пытаюсь получить значение, которое пользователь вводит в диалоговое окно, используя для него рекомендуемый класс DialogFragment, диалоговое окно строится и работает нормально, но я не могу вернуть значение параметра EditText в родительский класс без получения исключения нулевого указателя .

Мой класс DialogHost создает, возвращает и связывает родителя с его кнопками.

package jo.app.co;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;

public class DialogHost extends DialogFragment {


public interface NoticeDialogListener {
    public void onDialogPositiveClick(DialogFragment dialog);
    public void onDialogNegativeClick(DialogFragment dialog);
}

NoticeDialogListener mListener;

@override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {

        mListener = (NoticeDialogListener) activity;

    } catch (ClassCastException e) {      

        throw new ClassCastException(activity.toString());
    }
}

@override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.dialog_add, null))

           .setPositiveButton("Save", new DialogInterface.OnClickListener() {

               @override
               public void onClick(DialogInterface dialog, int id) {        
                   mListener.onDialogPositiveClick(DialogHost.this);                       

               }
           })
           .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   DialogHost.this.getDialog().cancel();                       
               }
           });      
    return builder.create();
}

}

Это мой класс MainActivity, показывающий диалоговое окно

package jo.app.co;

import android.app.DialogFragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.EditText;

public class MainActivity extends FragmentActivity implements      DialogHost.NoticeDialogListener {


 @override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    showNoticeDialog();

}

public void showNoticeDialog() {

    DialogFragment dialog = new DialogHost();
    dialog.show(getFragmentManager(), "DialogHost");
}


@override
public void onDialogPositiveClick(DialogFragment dialog) {

    EditText myText = (EditText) findViewById(R.id.item_added);
    try {
        Log.d ("IN TRY", myText.getText().toString());          
    }
    catch (Exception e) {
        Log.e ("IN CATCH", e.toString());
    }           

}

@override
public void onDialogNegativeClick(DialogFragment dialog) {        
    Log.d ("INMAIN", "REACHED NEG");
}


 }

Это макет моего диалога для справки.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">

    <EditText
       android:id="@+id/item_added"
       android:inputType="text"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="16dp"
       android:layout_marginLeft="4dp"
       android:layout_marginRight="4dp"
       android:layout_marginBottom="4dp"
       android:hint="@string/hint_add_item" />

</LinearLayout>

person user2555868    schedule 06.07.2013    source источник


Ответы (1)


Кажется, есть проблема с тем, как вы ссылаетесь на текст редактирования. Вам нужно получить его из представления, которое вы раздули. Попробуйте приведенный ниже код, который добавляет все функциональные возможности в ваше основное действие. Если вы хотите, вы можете адаптироваться к вашему случаю с помощью отдельного класса:

public void showNoticeDialog() {

public String inputvalue;

LayoutInflater inflater = LayoutInflater.from(this);
final View textenter = inflater.inflate(R.layout.dialog_add, null)
final EditText userinput = (EditText) textenter.findViewById(R.id.item_added); 
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(textenter)
          .setTitle("Your title");
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {

               @override
               public void onClick(DialogInterface dialog, int id) {        
                   inputvalue =  userinput.getText().toString();                  
                  // Do something with value in inputvalue
               }
           })
           .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                 dialog.cancel();

               }
           });      
    AlertDialog dialog = builder.create();
          builder.show();
         }

Для диалогового окна предупреждения вам необходимо раздуть xml, только если вы планируете иметь несколько представлений, таких как более 1 текста редактирования в этом диалоговом окне. Если вы планируете иметь только 1 текст редактирования, как в вашем примере, вам не нужен xml, и вы можете напрямую определить текст редактирования и установить его в качестве представления диалогового окна предупреждения.

final EditText userinput = new EditText(context);
            builder.setView(userinput);
person tony m    schedule 06.07.2013
comment
Спасибо @tony, я тоже так сделал. Я не хотел использовать второй вариант, который вы упомянули, именно по той причине, которую вы указали. - person user2555868; 06.07.2013
comment
приведенное выше решение 1 работает для вас? если да, подтвердите и примите ответ - person tony m; 06.07.2013