Обновить фрагмент при перезагрузке
на 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"); } }