onResume()
metoda nie zostanie wywołana, gdy przełączymy się między fragmentami więcej niż jeden raz. Czy istnieje lepszy sposób obsługi operacji wznowienia?Alternatywa dla onResume() podczas przełączania fragmentów
Odpowiedz
Myślę, że znalazłem odpowiedź. Oto link, który wymusi wywołanie onResume()
fragmentu za każdym razem, gdy fragment stanie się widoczny.
Fragments onResume from back stack
Można zrobić pracę wznowienia przez dostarczenie public
metody na każdym fragment
gdy wybrana strona, dam ci przykład:
public class MainActivity extends FragmentActivity {
private TabHost mTabHost;
private ViewPager mViewPager;
private TabsAdapter mTabsAdapter;
private ArrayList<Fragment> mFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
mViewPager = (ViewPager) findViewById(R.id.pager);
mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
mFragments = new ArrayList<Fragment>();
mFragments.add(new TestFragment1());
mFragments.add(new TestFragment2());
mFragments.add(new TestFragment3());
mTabsAdapter.addTab(mTabHost.newTabSpec("fragment1").setIndicator("fragment1"));
mTabsAdapter.addTab(mTabHost.newTabSpec("fragment2").setIndicator("fragment2"));
mTabsAdapter.addTab(mTabHost.newTabSpec("fragment3").setIndicator("fragment3"));
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("tab", mTabHost.getCurrentTabTag());
}
private void refreshPage(int i) {
Fragment fragment = mFragments.get(i);
switch (i) {
case 0:
((TestFragment1) fragment).refreshView();
break;
case 1:
((TestFragment2) fragment).refreshView();
break;
case 2:
((TestFragment3) fragment).refreshView();
break;
}
}
class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
ViewPager.OnPageChangeListener {
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mTabHost = tabHost;
mViewPager = pager;
mTabHost.setOnTabChangedListener(this);
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(TabHost.TabSpec tabSpec) {
tabSpec.setContent(new DummyTabFactory(mContext));
mTabHost.addTab(tabSpec);
notifyDataSetChanged();
}
@Override
public Fragment getItem(int i) {
return mFragments.get(i);
}
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
TabWidget widget = mTabHost.getTabWidget();
int oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
mTabHost.setCurrentTab(i);
widget.setDescendantFocusability(oldFocusability);
refreshPage(i);
}
@Override
public void onPageScrollStateChanged(int i) {
}
@Override
public void onTabChanged(String s) {
int postion = mTabHost.getCurrentTab();
mViewPager.setCurrentItem(postion, true);
}
@Override
public int getCount() {
return mFragments.size();
}
class DummyTabFactory implements TabHost.TabContentFactory {
private final Context mContext;
public DummyTabFactory(Context context) {
mContext = context;
}
@Override
public View createTabContent(String s) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}
}
}
a następnie piszesz swoją Fragment
tak:
public class TestFragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.main, container, false);
}
public void refreshView() {
//do whatever you want
}
}
Kod następuje:
Krok: 1
Tworzenie interfejsu:
public interface YourFragmentInterface {
void fragmentBecameVisible();
}
krok: 2
Attach Listner W setOnPageChangeListener:
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(final int position, final float v, final int i2) {
}
@Override
public void onPageSelected(final int position) {
YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, position);
if (fragment != null) {
fragment.fragmentBecameVisible();
}
}
@Override
public void onPageScrollStateChanged(final int position) {
}
});
krok: 3
Wdrożenie interfejsu In Your Fragment:
public class yourActivity extends SherlockFragment implements YourFragmentInterface{
@Override
public void fragmentBecameVisible() {
System.out.println("TestFragment");
}
}
zaimplementować to listner we wszystkich yor aktywności fragmentu fragmentBecameVisible()
to wywołanie metody podczas przełączania fragmentu.
Dzięki.
w rzeczywistości można po prostu zadzwonić pod numer YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem (mViewPager, position); if (fragment! = Null) { fragment.onResume(); } – Krit
Niesamowite, dziękuję człowieku. Szukałem tej poprawki. –
mam rozwiązać ten problem przy użyciu fragmentu metody ręczne:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (getView() != null) {
// your code goes here
}
}
}
Uwaga: W Viewpager pierwszej setUserVisibleHint fragmentu zwanego przed onCreateView więc trzeba się tym zająć.
handle setUserVisibleHint called before onCreateView in Fragment
Można spróbować,
Krok 1: Zastąpić metodę Tabselected w swojej działalności
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in
// the ViewPager.
try {
if(MyEventsFragment!=null && tab.getPosition()==3)
{
MyEvents.fragmentChanged();
}
}
catch (Exception e)
{
}
mViewPager.setCurrentItem(tab.getPosition());
}
Krok 2: Za pomocą metody statycznej, co chcesz w swoim fragmencie
public static void fragmentChanged()
{
Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show();
}
Możesz po prostu symulować onResume() dla każdego fragmentu za pomocą interfejsu !!!
1- tworzenia interfejsu nazwie FragmentLifecycle kod jest taki, jak następuje:
public interface FragmentLifecycle {
public void onResumeFragment();
}
2- Niech każdy fragment realizacji Interface
public class FragmentOne extends Fragment implements FragmentLifecycle
3- implementacji metod interfejsu w każdym fragmencie:
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG,Toast.LENGTH_SHORT).show();
}
4- Metody wywoływania wywołań po zmianie strony ViewPager:
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)adapter.getItem(position);
fragmentToShow.onResumeFragment();
}
});
Ciesz się!
'onResumeFragment' nie musi być publiczne, gdy jest zadeklarowane. Przepraszam za wybieranie nitów :) –
'adaper.getItem()' jest przeznaczony do wywoływania przez system. Jeśli wywołasz 'getView()' w 'onResumeFragment', zwróci on wartość null. Sprawdź tę odpowiedź: https://stackoverflow.com/a/45276364/1065835 –
- 1. Dlaczego moja aplikacja ulega awarii podczas szybkiego przełączania fragmentów?
- 2. Alternatywa dla BerkeleyDB?
- 3. NotImplementedError podczas przełączania do Poltergeist
- 4. Fragment onResume nie nazywa się
- 5. Freezing UI podczas transakcji fragmentów
- 6. WinForms: Alternatywa dla SplitContainer?
- 7. Alternatywa dla funkcji constexpr
- 8. Wzorzec projektowania dla przełączania klienta i przełączania awaryjnego WCF?
- 9. Serwer RStudio - zawiesza się podczas przełączania projektów
- 10. Zapobieganie przewijaniu strony podczas przełączania ostrości
- 11. Animacja podczas przełączania Aktywność w systemie Android?
- 12. Alternatywa dla Androida dla Line2D?
- 13. Alternatywa dla readAsBinaryString dla IE10
- 14. Alternatywa dla Firebuga dla Firefoksa?
- 15. Alternatywa dla supervisora dla docker
- 16. Alternatywa dla servicewrapper dla java?
- 17. czynności przełączania bez animacji
- 18. Używanie onResume() do odświeżania aktywności
- 19. Wystąpił błąd podczas dynamicznego dodawania fragmentów -java.lang.IllegalStateException:
- 20. Android Ukryj klawiaturę podczas zmiany fragmentów
- 21. Alternatywa dla NERDTree w Vim
- 22. dlaczego com.facebook.Settings.publishInstallAsync w onResume?
- 23. Alternatywa dla header_remove
- 24. Alternatywa dla „switch” oświadczenie
- 25. Alternatywa dla Flex Framework
- 26. Alternatywa dla FogBugz?
- 27. Alternatywa dla $ httpProvider.responseInterceptors
- 28. Alternatywa dla scipy.optimize.curve_fit
- 29. Alternatywa dla FusedLocationProviderApi
- 30. Alternatywa dla pliku CSV?
Co masz na myśli, zmieniając fragmenty? – Desert
Np .: Aktywność "A" wczytuje fragment "X", a niektóre kliknięcia przycisku zamieniają fragment "X" na "Y". Następnie, jeśli naciśniesz 'onResume()' fragmentu 'X' nie zostanie wywołany. – Manjunath