Доступ из DialogFragment для размещения представлений Activity - PullRequest
0 голосов
/ 26 декабря 2018

Я сталкивался с такой проблемой.В моем приложении у меня есть активность (MobileActivity), которая содержит некоторые виды (Spinners, TextViews и Button).Когда пользователь нажимает на кнопку, мне нужно открыть диалог (ConfirmDialog).В этом диалоге мне нужно показать некоторые данные из представлений MobileActivity (см. Код ниже).А иногда в Play Console я вижу отчеты о сбоях с NullPointerException (я пометил эту строку в своем коде).В чем проблема?

Спасибо!

Я предположил, что проблема может быть в методах жизненного цикла Activity.Я попробовал следующие действия:

  • Запустил мое приложение на эмуляторе и открыл DialogFragment
  • Нажал Домой Кнопка
  • В ADB, убил мой процесс(adb kill)
  • Повторно открыл мое приложение из фоновых приложений

Оно не вылетело.Итак, проблема не в заднем | переднем плане?

Код от MobileActivity, который откроет мой DialogFragment

ConfirmDialog newFragment = new ConfirmDialog();
newFragment.show(getFragmentManager(), "Confirmation"); 

Код из ConfirmDialog

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
            View v = null;
        Spinner s;
            v = inflater.inflate(R.layout.confirm_mobile_layout, null);
        builder.setView(v);
        //next row marked in stacktrace as problem row
        //Spinner with Id=acn_debit_mobile is placed on MobileActivity
        s = getActivity().findViewById(R.id.acn_debit_mobile);         
        Spinner b = getActivity().findViewById(R.id.biller_mobile);
            //other code
            return builder.create();
 }

И трассировка стека из Play Console

java.lang.RuntimeException: 
 at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2814)
 at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892)
 at android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:4763)
 at android.app.ActivityThread.-wrap18 (Unknown Source)
 at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1621)
 at android.os.Handler.dispatchMessage (Handler.java:106)
 at android.os.Looper.loop (Looper.java:171)
 at android.app.ActivityThread.main (ActivityThread.java:6635)
 at java.lang.reflect.Method.invoke (Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
 at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)

Caused by: java.lang.NullPointerException: 
 at ua.grant.smart.ConfirmDialog.onCreateDialog (ConfirmDialog.java:121)
 at android.app.DialogFragment.onGetLayoutInflater (DialogFragment.java:406)
 at android.app.Fragment.performGetLayoutInflater (Fragment.java:1325)
 at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1279)
 at android.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1562)
 at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1623)
 at android.app.FragmentManagerImpl.dispatchMoveToState (FragmentManager.java:3032)
 at android.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:2984)
 at android.app.FragmentController.dispatchActivityCreated (FragmentController.java:178)
 at android.app.Activity.performCreate (Activity.java:7090)
 at android.app.Activity.performCreate (Activity.java:7075)
 at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
 at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2767)

Я добавил методы onAttach и onDetach для хранения ссылки на мой хост Activity (код ниже),и заменил getActivity () на mActivity во всех местах в моем классе ConfirmDialog.Решит ли это эту проблему?

mActivity Activity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = activity;
}

@Override
public void onDetach() {
    super.onDetach();
    mActivity = null;
}

1 Ответ

0 голосов
/ 26 декабря 2018

Хранение экземпляра действия и уничтожение его при отсоединении фрагмента - хороший способ избежать NullPointerException

mActivity Activity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = activity;
}

@Override
public void onDetach() {
    super.onDetach();
    mActivity = null;
}

Но есть две вещи, которые вам, возможно, понадобится рассмотреть.

  1. Почему бы вам не использовать тот же подход к вашему фрагменту, где mActivity в вашем onCreateDialog.Кстати, пожалуйста, проверьте NULL для mActivity, прежде чем делать какие-либо транзакции.

enter image description here

Используя yourDialogFragment.show(), явно запустите эту функцию:

enter image description here

ft.commit() планирует фиксацию этой транзакции.Фиксация не происходит сразу.Это будет запланировано как работа над основным потоком, которая будет сделана в следующий раз, когда поток будет готов.Поэтому мы ничего не можем гарантировать, это может вызвать, например, IllegalStateException.

Как насчет: commitAllowingStateLoss().Но внимательно прочитайте документ перед использованием.Взгляните на это .

Почему бы вам не надуть взгляд на onCreateView?(Вам не нужно делать это в onCreateDialog)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...