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

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

问题描述

我用ActionBarActivity创建5个选项卡。我已经使用ViewPager的5个选项卡使用SectionsPagerAdapter延伸FragmentPagerAdapter之间刷卡。每个标签都有称为oncreateview方法的AsyncTask的一个片段。当我在一个片段,AsyncTask的其他片段被调用。

我试过oncreateview方法使用的AsyncTask的敬酒消息的每个片段来代替。但错误的敬酒的消息被解雇错误的片段。

onCreate方法code:

  mSectionsPagerAdapter =新SectionsPagerAdapter(getSupportFragmentManager());


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


        mViewPager.setOnPageChangeListener(新ViewPager.SimpleOnPageChangeListener(){
                    @覆盖
                    公共无效onPageSelected(INT位置)
                    {
                        actionBar.setSelectedNavigationItem(位置);
                        actionBar.setTitle(getHomePageTitle(位置));
                    }
                });


        的for(int i = 0; I< mSectionsPagerAdapter.getCount();我++)
        {
            //创建与对应于由所定义的页标题文本标签
            //适配器。同时,指定此活动的对象,它实现
            //该TabListener界面,回调(监听程序)进行时
            //这个选项卡中选择。
            actionBar.addTab(actionBar.newTab()
                    .setIcon(getPagedrawable(I))
                    .setTabListener(本));

        }
 

//适配器类code:

 公共类SectionsPagerAdapter扩展FragmentPagerAdapter {

    公共SectionsPagerAdapter(FragmentManager FM)
    {
        超(FM);
    }

    @覆盖
    公共片段的getItem(INT位置){


    开关(位置)
    {
        情况下0:
            片段1 F1 =新片段1();
            回到F1;

        情况1:
            Fragment2 F2 =新Fragment2();
            返回F2;

        案例2:
            Fragment3 F3 =新Fragment3();
            返回F3;

        案例3:
            Fragment4 F4 =新Fragment4();
            返回F4;


        壳体4:
            Fragment5 F5 =新Fragment5();
            返回F5;

        }

        返回null;

    }

    @覆盖
    公众诠释getCount将(){
        //显示5总页数。
        返回5;
    }


}
 

Fragemnt类code:

 公共类F1扩展片段
{
@覆盖
公共无效的onCreate(包savedInstanceState)
{
    super.onCreate(savedInstanceState);

}

 @燮pressLint(NewApi)
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState)
{
    查看查看= inflater.inflate(R.layout.f1,集装箱,假);

     Toast.makeText(getActivity(),F1,Toast.LENGTH_SHORT).show();
    返回查看;
}
}
 

解决方案

FragmentPagerAdapter 保持额外的片段,除了显示的,在恢复状态。解决的办法是实现一个自定义 OnPageChangeListener 并为片段显示,当一种新的方法。

1)创建 LifecycleManager 接口 该接口有两个方法,每个 ViewPager的片段会实现它。这些方法如下:

 公共接口FragmentLifecycle {

    公共无效onPauseFragment();
    公共无效onResumeFragment();

}
 

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

 公共类FragmentBlue扩展片段实现FragmentLifecycle
公共类FragmentGreen扩展片段实现FragmentLifecycle
公共类FragmentPink扩展片段实现FragmentLifecycle
 

3)实施中的每个片断接口中的方法 为了检查它是否真的正常工作,我只是记录方法调用,并显示吐司:

  @覆盖
公共无效onPauseFragment(){
    Log.i(TAG,onPauseFragment());
    Toast.makeText(getActivity(),onPauseFragment():+ TAG,Toast.LENGTH_SHORT).show();
}

@覆盖
公共无效onResumeFragment(){
    Log.i(TAG,onResumeFragment());
    Toast.makeText(getActivity(),onResumeFragment():+ TAG,Toast.LENGTH_SHORT).show();
}
 

4)ViewPager改换调用接口的方法 您可以设置OnPageChangeListener上ViewPager并得到回调,每次当ViewPager显示另一页:

  pager.setOnPageChangeListener(pageChangeListener);
 

5)实施OnPageChangeListener打电话给你定制的生命周期方法

监听器知道新的位置,并可以调用新片段的接口方法PagerAdapter的帮助。我在这里可以调用onResumeFragment()的新片段和onPauseFragment()在当前之一。

我还需要保存当前片段的位置(最初的当前位置为0),因为我不知道用户从左至右或从右滚动是否要离开。明白我的意思在code:

 私人OnPageChangeListener pageChangeListener =新OnPageChangeListener(){

    INT currentPosition = 0;

    @覆盖
    公共无效onPageSelected(INT在newPosition){

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

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

        currentPosition =在newPosition;
    }

    @覆盖
    公共无效onPageScrolled(INT为arg0,浮动ARG1,INT ARG2){}

    公共无效onPageScrollStateChanged(INT为arg0){}
};
 

我没写code。完整的教程:<一href="http://looksok.word$p$pss.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-$c$c/">http://looksok.word$p$pss.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-$c$c/

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.

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

        }

// Adapter class code:

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


}

Fragemnt class code :

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

解决方案

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) 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) 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) 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) 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) Implement OnPageChangeListener to call your custom Lifecycle methods

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.

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

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/

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

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