onResume()
當我們在多次片段之間切換時,方法不會被調用。那麼,有沒有更好的方法來處理恢復操作?片段切換過程中onResume()的替代方法
回答
我想,我找到了答案。這裏是鏈接,每當片段變得可見時,將強制片段的onResume()
被調用。
Fragments onResume from back stack
你可以做恢復工作,通過提供每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
}
}
代碼如下:
步驟: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()
片段切換時調用此方法。
謝謝。
其實你可以直接調用 YourFragmentInterface fragment =(YourFragmentInterface)mPagerAdapter.instantiateItem(mViewPager,position);如果(片段!=空){ fragment.onResume(); } – Krit
太棒了,謝謝你。我正在尋找這個修復。 –
我已經解決了使用片段覆蓋方法這個問題:
@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
你可以試試這個,
第一步:重寫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();
}
您可以簡單地模擬每個片段的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();
}
});
享受!
'onResumeFragment'在聲明時不必公開。對不起,挑選:) –
'adaper.getItem()'被設計爲由系統調用。如果你在'onResumeFragment'中調用'getView()',它將返回null。請查看這個答案:https://stackoverflow.com/a/45276364/1065835 –
- 1. 以編程方式切換片段
- 2. 的onPause()和的onResume()命令替換片段
- 3. 片段的onResume中的NullPointerException
- 4. 以編程方式替換片段
- 5. jQuery切換替代方式?
- 6. 的onResume不片段
- 7. 通過清除已有的片段替換Android中的片段
- 8. 無法替換android 2.2中的片段
- 9. 替代切換
- 10. 處理onResume片段
- 11. 片段撤回onResume
- 12. 片段具體onResume
- 13. 片段中的onResume方法不起作用
- 14. 替換片段
- 15. 替換片段中的Android
- 16. 替換ViewPagerAdapter中的片段
- 17. 通過這段代碼通過片段代替的東西用一個片段
- 18. 片段無法用viewpager中的片段替換
- 19. 在android中切換片段?
- 20. java.lang.ClassCastException切換片段
- 21. 帶片段的ViewPager - onPause(),onResume()?
- 22. 無法在viewpager中替換片段
- 23. 此過程的光標替代方法?
- 24. Android編程中無法從片段切換到Activity/Activity到片段
- 25. 如何替換片段內的片段?
- 26. 在ViewPager中替換片段
- 27. 從OnClickListener中替換片段
- 28. 在viewpager中替換片段
- 29. 切換裏面的片段
- 30. 無法替換一個新的片段
你是什麼意思,通過切換片段? – Desert
例如:活動'A'加載一個片段'X',點擊一下按鈕會將片段'X'切換爲'Y'。然後,如果你按下'onResume()'的片段'X'將不會被調用。 – Manjunath