SetText TextView в DialogFragment из вызывающей активности

Создание приложения для Android и некоторые проблемы. Буду признателен за любую помощь!

Я создал класс, который расширяет DialogFragment (Account_Create_Error), который я вызываю из Activity A. Я хочу установить поле TextView в этом DialogFragment из Activity A. Я создал метод в своем диалоговом фрагменте

public void setError(String message) {
           TextView error = (TextView)getActivity().findViewById(R.id.message);
           error.setText(message);
}

Затем я использую этот метод в действии A, выполняя

Account_Create_Error error = new Account_Create_Error();
error.show(getFragmentManager(), "error");
error.setError(json.getString("response"));

Кажется, я получаю исключение нулевого указателя от findViewById.

Пожалуйста, дайте мне знать, если предоставление моего кода будет полезно.

Спасибо!!


person user2737686    schedule 21.03.2014    source источник
comment
Вы вызываете setContentView() в своем конструкторе Account_Create_Error?   -  person Philip Liberato    schedule 22.03.2014
comment
Попробуйте использовать view.findViewById(R.id.message) в методе DialogFragment onViewCreated(...) и переместите объявление TextView error; в экземпляр класса DialogFragment.   -  person Squonk    schedule 22.03.2014
comment
Я не вызываю setContentView.   -  person user2737686    schedule 22.03.2014


Ответы (3)


Мы можем передать данные фрагменту диалога с помощью конструктора.

UserActionDialogFragment dialog = UserActionDialogFragment.newInstance(errorMesssage);
dialog.show(getFragmentManager(), TAG);

Где UserActionDialogFragment extends DialogFragment

public class NotificationDialogFragment extends DialogFragment {

    private static final String TAG = "NotificationDialogFragment";

    private String mMessageToDisplay;

    public static NotificationDialogFragment newInstance(
            String message) {

        NotificationDialogFragment infoDialog = new NotificationDialogFragment();
        mMessageToDisplay = message


    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
        alertDialog.setMessage(mMessageToDisplay);
        alertDialog.setNeutralButton(R.string.label_ok,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface arg0, int arg1) {

                    }
                });
        return alertDialog.create();
    }


    }
person Jitendra    schedule 22.03.2014
comment
Благодарю вас! Это сработало. Единственное изменение, которое я должен был сделать, это использовать специально созданное представление для установки текстового представления, а не setmessage. setmessage работал нормально, но у меня было собственное представление, поэтому оно просто появилось вверху. Еще раз спасибо! Ты жжешь. - person user2737686; 23.03.2014
comment
Добро пожаловать. Приятно знать, что это помогло. - person Jitendra; 24.03.2014

Попробуйте получить EditText из средства просмотра, установленного в конструкторе, а не из getActivity(). Это должно быть достаточно

@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
    LayoutInflater inflater = getActivity().getLayoutInflater();
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    View view = inflater.inflate(R.layout.your_dialog, null);
    builder.setView(view);  
    EditText error = (EditText)(view.findViewById(R.id.message));
    ....
    return builder.create();
}

Я не использовал метод onViewCreated, как упоминалось выше. Средство просмотра настроено в конструкторе, как указано в документе.

person zhen_khokh    schedule 09.09.2016

Мой дорогой друг, я также столкнулся с той же проблемой в одном из моих проектов. Я решаю это следующим образом: создаю интерфейс и реализую его в своем классе фрагментов. В моей реализованной функции я обновляю свой textView. (в вашем случае вам необходимо инициализировать errorTV перед вызовом этой функции).

person Attiq ur Rehman    schedule 21.03.2014
comment
Я пытаюсь это сделать, но не могу заставить это работать. Приложение по-прежнему вылетает. Должен ли я добавлять интерфейс в DialogFragment и реализовывать его в DialogFragment и в Activity A? Я пытался реализовать его в обоих случаях, только в DialogFragment (не уверен, почему это сработает) и только в Activity A, но ничего не работает. - person user2737686; 22.03.2014
comment
Друг мой, ты реализуешь этот интерфейс в FragmentActivity и вызовешь из класса Activity вот так (new FragmentClass().implementedFunction();) - person Attiq ur Rehman; 22.03.2014