使用 ViewPager 时如何处理 ActionBarActivity Fragments 中的 AsyncTask? [英] How to handle AsyncTask's in ActionBarActivity Fragments when ViewPager is used?

查看:17
本文介绍了使用 ViewPager 时如何处理 ActionBarActivity Fragments 中的 AsyncTask?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 ActionBarActivity 创建 5 个选项卡.我已经使用 ViewPager 使用 SectionsPagerAdapter 在 5 个选项卡之间滑动,它扩展了 FragmentPagerAdapter.每个选项卡都有一个片段,其中包含一个在 oncreateview 方法中调用的异步任务.当我在一个片段中时,正在调用另一个片段中的 asynctask.

I'm using ActionBarActivity to create 5 tabs. I have used ViewPager to swipe between the 5 tabs using SectionsPagerAdapter which extends FragmentPagerAdapter. Each tab has a fragment with an asynctask called in oncreateview method. When I'm in one fragment, asynctask in other fragment is being called.

我尝试在 oncreateview 方法中使用 toast 消息是每个片段而不是 asynctask.但是错误的 Toast 消息在错误的片段中被触发.

I tried using toast messages in oncreateview method is each fragment instead of asynctask. But wrong toast messages are being fired in wrong fragment.

Oncreate 方法代码:

Oncreate method code:

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());


        mViewPager = (ViewPager) findViewById(R.id.pager_exp); 
        mViewPager.setAdapter(mSectionsPagerAdapter);


        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) 
                    {
                        actionBar.setSelectedNavigationItem(position);
                        actionBar.setTitle(getHomePageTitle(position)); 
                    }
                });


        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) 
        {
            // Create a tab with text corresponding to the page title defined by
            // the adapter. Also specify this Activity object, which implements
            // the TabListener interface, as the callback (listener) for when
            // this tab is selected.
            actionBar.addTab(actionBar.newTab()
                    .setIcon(getPagedrawable(i))
                    .setTabListener(this));

        }

//适配器类代码:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) 
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {


    switch (position) 
    {
        case 0:
            Fragment1 f1 = new Fragment1(); 
            return f1;

        case 1:
            Fragment2 f2 = new Fragment2(); 
            return f2;

        case 2:
            Fragment3 f3 = new Fragment3();  
            return f3;

        case 3: 
            Fragment4 f4 = new Fragment4();
            return f4;


        case 4: 
            Fragment5 f5 = new Fragment5();
            return f5;

        }

        return null;

    }

    @Override
    public int getCount() {
        // Show 5 total pages.
        return 5;  
    } 


}

片段类代码:

public class F1 extends Fragment 
{
@Override
public void onCreate(Bundle savedInstanceState)  
{
    super.onCreate(savedInstanceState);

}

 @SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    View view       = inflater.inflate(R.layout.f1,container, false);

     Toast.makeText(getActivity(), "F1", Toast.LENGTH_SHORT).show();
    return view;  
}   
}

推荐答案

FragmentPagerAdapter 将其他片段(除了显示的片段)保持在恢复状态.解决方案是实现一个自定义的 OnPageChangeListener 并在显示片段时创建一个新方法.

The FragmentPagerAdapter keeps additional fragments, besides the one shown, in resumed state. The solution is to implement a custom OnPageChangeListener and create a new method for when the fragment is shown.

1) 创建 LifecycleManager 接口该接口将有两个方法,每个 ViewPager's Fragment 将实现它.这些方法如下:

1) Create LifecycleManager Interface The interface will have two methods and each ViewPager’s Fragment will implement it. These methods Are as follows:

public interface FragmentLifecycle {

    public void onPauseFragment();
    public void onResumeFragment();

}

2) 让每个Fragment实现接口为每个类声明添加 iplements 语句:

2) Let each Fragment implement the interface Add iplements statement for each class declaration:

public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle

3) 在每个片段中实现接口方法为了检查它是否真的按预期工作,我将记录方法调用并显示 Toast:

3) Implement interface methods in each fragment In order to check that it really works as expected, I will just log the method call and show Toast:

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

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

4) ViewPager 页面变化调用接口方法您可以在 ViewPager 上设置 OnPageChangeListener 并在每次 ViewPager 显示另一个页面时获取回调:

4) Call interface methods on ViewPager page change You can set OnPageChangeListener on ViewPager and get callback each time when ViewPager shows another page:

pager.setOnPageChangeListener(pageChangeListener);

5) 实现 OnPageChangeListener 以调用您的自定义 Lifecycle 方法

5) Implement OnPageChangeListener to call your custom Lifecycle methods

Listener 知道新的位置,可以在 PagerAdapter 的帮助下调用新的 Fragment 上的接口方法.我可以在这里对新片段调用 onResumeFragment(),对当前片段调用 onPauseFragment().

Listener knows the new position and can call the interface method on new Fragment with the help of PagerAdapter. I can here call onResumeFragment() for new fragment and onPauseFragment() on the current one.

我还需要存储当前片段的位置(最初当前位置等于 0),因为我不知道用户是从左向右滚动还是从右向左滚动.看看我在代码中的意思:

I need to store also the current fragment’s position (initially the current position is equal to 0), since I don’t know whether the user scrolled from left to right or from right to left. See what I mean in code:

private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {

    int currentPosition = 0;

    @Override
    public void onPageSelected(int newPosition) {

        FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
        fragmentToShow.onResumeFragment();

        FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
        fragmentToHide.onPauseFragment();

        currentPosition = newPosition;
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) { }

    public void onPageScrollStateChanged(int arg0) { }
};

我没有写代码.完整教程在这里:http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

I didn't write the code. Full tutorial here: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

这篇关于使用 ViewPager 时如何处理 ActionBarActivity Fragments 中的 AsyncTask?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆