2013-07-24 29 views
27

onResume()當我們在多次片段之間切換時,方法不會被調用。那麼,有沒有更好的方法來處理恢復操作?片段切換過程中onResume()的替代方法

+0

你是什麼意思,通過切換片段? – Desert

+0

例如:活動'A'加載一個片段'X',點擊一下按鈕會將片段'X'切換爲'Y'。然後,如果你按下'onResume()'的片段'X'將不會被調用。 – Manjunath

回答

2

你可以做恢復工作,通過提供每fragment一個public方法選擇的頁面的時候,我給你一個例子:

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 fragment =(YourFragmentInterface)mPagerAdapter.instantiateItem(mViewPager,position);如果(片段!=空){ fragment.onResume(); } – Krit

+0

太棒了,謝謝你。我正在尋找這個修復。 –

0

我已經解決了使用片段覆蓋方法這個問題:

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

注:在,所以你需要處理這個onCreateView之前稱爲Viewpager第一個片段setUserVisibleHint。

handle setUserVisibleHint called before onCreateView in Fragment

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'在聲明時不必公開。對不起,挑選:) –

+0

'adaper.getItem()'被設計爲由系統調用。如果你在'onResumeFragment'中調用'getView()',它將返回null。請查看這個答案:https://stackoverflow.com/a/45276364/1065835 –