Fragment切换期间onResume()的替代方案

31

onResume()方法在多次切换片段时不会被调用。那么,有没有更好的方法来处理恢复操作?


切换片段是什么意思? - Desert
1
活动'A'加载了一个片段'X',某些按钮点击将片段'X'切换为'Y'。然后,如果您按返回键,则不会调用片段'X'的'onResume()'方法。 - Manjunath
6个回答

41

代码如下:

步骤: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

在您的Fragment中实现接口:

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

请在所有的Fragment Activity中实现这个监听器:fragmentBecameVisible()方法会在Fragment切换时被调用。

谢谢。


实际上,你可以直接调用以下代码: YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, position); if (fragment != null) { fragment.onResume(); } - Krit

5
您可以通过使用接口来简单地为每个片段模拟onResume()!!!
1-创建一个名为FragmentLifecycle的接口,代码如下:
public interface FragmentLifecycle {
   public void onResumeFragment();
}

2- 让每个Fragment实现该接口:

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时,它不必是公共的。抱歉我有点挑剔 :) - Maksim Dmitriev
adaper.getItem() 是被设计为由系统调用的。如果你在 onResumeFragment 中调用 getView(),它将返回 null。请查看此答案:https://dev59.com/vGoy5IYBdhLWcg3wFqFT#45276364 - Maksim Dmitriev
我添加了 if (position == fragmentPos) 然后调用了这个片段。 - Ticherhaz FreePalestine

3

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

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

第二步:在您的片段中使用静态方法来执行您想要的操作。
public static void fragmentChanged()
{
    Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show();
}

0

我使用片段覆盖方法解决了这个问题:

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

注意:在Viewpager的第一个片段中,setUserVisibleHint在onCreateView之前被调用,因此您需要处理这个问题。

处理Fragment中setUserVisibleHint在onCreateView之前被调用的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接