Обновление фрагмента пользовательского интерфейса внутри fragmentclass

#java #android

#java #Android

Вопрос:

У меня есть фрагмент, который подключен к классу. У меня есть фоновый поток, который работает в фоновом режиме каждые 1 минуту, и мне нужно, чтобы пользовательский интерфейс обновлялся специально, если пользователь «смотрит» на экран.

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

                     // Updating TextViews and such with textView.SetText(); ....
                    
                    if (isResumed()) {
                        try {
                            // This throws an error sometimes saying: getFragmentManager() can't be called on null instance
                            getFragmentManager().beginTransaction().replace(R.id.fragment_container, new LiveViewFragment()).commitNow();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
  

Мой вопрос:
Как я могу принудительно обновить фрагмент?

Другой код, который я пробовал, это:

  LiveViewFragment fragment = (LiveViewFragment) getFragmentManager().findFragmentById(R.id.fragment_container);
    getFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
  

Но это также иногда терпит неудачу.

Комментарии:

1. Эй, не рекомендуется «принудительно обновлять фрагмент». Вместо этого почему бы вам не использовать текущие данные или что-нибудь еще для обновления ваших представлений внутри фрагмента? Было бы здорово, если бы вы могли уточнить, что вы хотите обновить во фрагменте

2. Что вы подразумеваете под «оперативными данными»? Некоторые текстовые представления обновляются в фоновом потоке, но они не отображаются. Мне нужно выйти из фрагмента, а затем снова войти в него, чтобы увидеть изменения.

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

4. Используйте LiveData: developer.android.com/topic/libraries/architecture/livedata

Ответ №1:

не рекомендуется обновлять фрагмент . Вместо этого почему бы вам не использовать текущие данные или что-нибудь еще для обновления ваших представлений внутри фрагмента?

неважно. вы можете попробовать эту простую функцию

   fun recreateFragment(fragment : Fragment) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        supportFragmentManager.beginTransaction().detach(fragment).commit()
        supportFragmentManager.beginTransaction().attach(fragment).commit()
    } else {
        supportFragmentManager.beginTransaction().detach(fragment).attach(fragment).commit()
    }
}