2013-07-24 3 views
27

onResume() метод не будет вызываться при переключении между фрагментами более одного раза. Итак, есть ли лучший способ справиться с возобновлением работы?Альтернатива для onResume() при переключении фрагментов

+0

Что вы подразумеваете, переключаясь между фрагментами? – Desert

+0

Ex: Activity 'A' загружает фрагмент «X», а некоторые кнопки будут переключаться с фрагмента «X» на «Y». Затем, если вы нажмете 'onResume()' фрагмента 'X', не будет вызываться. – Manjunath

ответ

3

Думаю, я нашел ответ. Вот ссылка, которая заставит onResume() фрагмента вызываться каждый раз, когда фрагмент становится видимым.
Fragments onResume from back stack

2

Вы можете сделать резюме работу обеспечить public метод на каждом fragment при выборе страницы, я даю вам пример:

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; 
     } 
    } 
} 
} 

, а затем вы пишете свой Fragment так:

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 
} 
} 
39

Код:

Шаг: 1

Создать интерфейс:

public interface YourFragmentInterface { 
    void fragmentBecameVisible(); 
} 

Шаг: 2

Приложить В 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) { 
     } 
    }); 

Шаг: 3

Реализация интерфейса в фрагменте:

public class yourActivity extends SherlockFragment implements YourFragmentInterface{ 
    @Override 
    public void fragmentBecameVisible() { 
      System.out.println("TestFragment"); 
    } 
} 

Реализовать это во всех у слушателя йор фрагмент активности fragmentBecameVisible() этот метод вызова во время переключения фрагмента.

Спасибо.

+0

Фактически вы можете просто позвонить YourFragmentInterface фрагмент = (YourFragmentInterface) mPagerAdapter.instantiateItem (mViewPager, position); if (fragment! = Null) { fragment.onResume(); } – Krit

+0

Awesome, Спасибо, человек. Я искал это исправление. –

0

Я решил эту проблему с помощью фрагмента метода Override:

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
     if (getView() != null) { 
      // your code goes here 
     } 
    } 
} 

Примечание: В первом фрагменте setUserVisibleHint ViewPager Вызывается перед onCreateView так что вам нужно справиться с этим.

handle setUserVisibleHint called before onCreateView in Fragment

1

Вы можете попробовать это,

Шаг1: Переопределить метод Tabselected в вашей деятельности

@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()); 
} 

Шаг 2: Используя статический метод, делать то, что вы хотите в вашем фрагменте,

public static void fragmentChanged() 
{ 
    Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show(); 
} 
0

Вы можете просто имитировать onResume() для каждого фрагмента используя интерфейс !!!

1- создать интерфейс с именем FragmentLifecycle, код выглядит следующим образом:

public interface FragmentLifecycle { 
    public void onResumeFragment(); 
} 

2- Пусть каждый фрагмент реализуют интерфейс:

public class FragmentOne extends Fragment implements FragmentLifecycle 

3- реализовать методы интерфейса в каждом фрагменте:

@Override 
public void onResumeFragment() { 
    Log.i(TAG, "onResumeFragment()"); 
    Toast.makeText(getActivity(), "onResumeFragment():" + TAG,Toast.LENGTH_SHORT).show(); 
} 

4 Методы вызова вызова при изменении страницы ViewPager:

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 

      FragmentLifecycle fragmentToShow = (FragmentLifecycle)adapter.getItem(position); 
      fragmentToShow.onResumeFragment(); 
     } 
    }); 

Наслаждайтесь!

+0

'onResumeFragment' не должен быть общедоступным, когда он объявлен. Извините за nit-picking :) –

+0

'adaper.getItem()' предназначен для вызова системой. Если вы вызываете 'getView()' в 'onResumeFragment', он возвращает null. Ответьте на этот вопрос: https://stackoverflow.com/a/45276364/1065835 –

Смежные вопросы