Все элементы фрагмента обнуляются после его добавления / замены в активности. - PullRequest
0 голосов
/ 10 мая 2018

У меня есть действие, в котором я хочу заменить фрагмент. Код, который я использую, приведен ниже:

 ResultFragment resultFragment = new ResultFragment();
 FragmentManager fragmentManager = getSupportFragmentManager();                      
 fragmentManager.beginTransaction()                  
 .replace(R.id.fl_act_events_view_container, resultFragment, "ResultFragment")
 .commit();
 fragmentManager.executePendingTransactions();
 resultFragment.updateUI(result);

Я выполняю этот код в методе Activity класса OnCreate ().

Метод updateUI () просто обновляет значения всех элементов фрагмента результата на основе строки «result». Проблема, с которой я сталкиваюсь, заключается в том, что при вызове updateUI () все элементы являются нулевыми.

Например, ResultFragment имеет имя TextView. Когда я делаю:

 name.setText(result.getName());

Я получаю исключение NullPointerException, так как имя равно null. Аналогично для всех других элементов пользовательского интерфейса ResultFragment.

Я не могу понять, в чем проблема? Я пробовал несколько методов, но ничего не работает. Мол, я тоже сделал следующее:

  Fragment fragment = getSupportFragmentManager().findFragmentByTag("ResultFragment");
    if(fragment instanceof ResultFragment){
        resultFragment = (ResultFragment) fragment;
        resultFragment.updateUI(result);
    }

но та же проблема сохраняется.

Тогда я попробовал:

    ResultFragment resultFragment = new ResultFragment();
    replaceFragment(resultFragment);
  ResultFragment.updateUI(result);


    public void replaceFragment(Fragment fragment) {
      if(fragment==null) return;

      FragmentManager fm = getSupportFragmentManager();
      FragmentTransaction ft = fm.beginTransaction();
      ft.replace(R.id.fl_act_events_view_container, fragment);
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
      ft.commitAllowingStateLoss();
    }

но ничего не работает. Кто-нибудь, пожалуйста, объясните, как я могу вызывать метод updateUI после замены фрагмента в упражнении

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Итак, потратив много времени, я наконец понял, что updateUI вызывается до инициализации всех элементов.Это было скорее вопросом времени.Мне просто нужно было убедиться, что все элементы инициализированы перед вызовом updateUI, и, таким образом, это решило проблему.

0 голосов
/ 10 мая 2018

Вы можете обновить представления в updateUI(), поместив коды в updateUI() внутри потока.Например, Runnable

Внутри фрагмента, объявите объект и вызовите в действии.

public Runnable mRunnableUpdate = new Runnable() {
    @Override
    public void run() {
        updateUI();
    }
};

Активность mRunnableUpdate.run();

...