Обновить фрагмент при перезагрузке
на android
приложение я загружаю данные из Db
на TableView
внутри Fragment
. Но когда я Reload
the fragment
он отображает предыдущие данные. Могу ли я повторно заселить Fragment
с текущими данными вместо предыдущих данных?
9 ответов:
Я думаю, что вы хотите обновить содержимое фрагмента при обновлении БД
Если это так, отсоедините фрагмент и переклеивать
// Reload current fragment Fragment frg = null; frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG"); final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.detach(frg); ft.attach(frg); ft.commit();
Your_Fragment_TAG-это имя, которое вы дали своему фрагменту при его создании
этот код предназначен для поддержки библиотеки.
Если вы не поддерживать старые устройства, просто используйте getFragmentManager вместо getSupportFragmentManager
[EDIT]
этот метод требует, чтобы фрагмент имел тег.
В случае, если у вас его нет, то метод @Hammer-это то, что вам нужно.
это обновит текущий фрагмент:
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.detach(this).attach(this).commit();
в случае, если у вас нет тега фрагмента, следующий код хорошо работает для меня.
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container); if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") { FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction(); fragTransaction.detach(currentFragment); fragTransaction.attach(currentFragment); fragTransaction.commit();} }
вы не можете перезагрузить фрагмент, пока он прикреплен к действию, где вы получаете"
Fragment Already Added
" исключение.getFragmentManager().beginTransaction().detach(this).attach(this).commit();
обновление: Это должно включать изменения, внесенные в API 26 и выше:
FragmentTransaction transaction = mActivity.getFragmentManager() .beginTransaction(); if (Build.VERSION.SDK_INT >= 26) { transaction.setReorderingAllowed(false); } transaction.detach(this).attach (this).commit();
для более подробного описания обновления см. https://stackoverflow.com/a/51327440/4514796
использовать
ContentProvider
и загрузить данные с помощью "CursorLoader". С помощью этой архитектуры ваши данные будут автоматически перезагружены при изменении базы данных. Используйте сторонние структуры дляContentProvider
- вы действительно не хотите реализовать его самостоятельно...
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG); getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
это будет работать только если вы используете
FragmentManager
для инициализации фрагмента. Если у вас есть это как<fragment ... />
в XML, он не будет вызыватьonCreateView
еще раз. Потратил свои 30 минут, чтобы понять это.
у меня была та же проблема, но ни один из вышеперечисленных не работал для моего. либо была проблема с backstack (после загрузки, когда пользователь нажал назад, он снова должен был пойти на тот же фрагмент), либо он не вызывал
onCreaetView
наконец я сделал это:
public void transactFragment(Fragment fragment, boolean reload) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); if (reload) { getSupportFragmentManager().popBackStack(); } transaction.replace(R.id.main_activity_frame_layout, fragment); transaction.addToBackStack(null); transaction.commit(); }
хороший момент - вам не нужен тег или идентификатор фрагмента. если вы хотите перезагрузить
вы можете обновить фрагмент, когда он виден пользователю, просто добавьте этот код в свой фрагмент, это обновит ваш фрагмент, когда он будет виден.
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Refresh your fragment here getFragmentManager().beginTransaction().detach(this).attach(this).commit(); Log.i("IsRefresh", "Yes"); } }