15

私は ActionBarActivity を使って 5 つのタブを作成しています。FragmentPagerAdapterを拡張するSectionsPagerAdapterを使用して、ViewPagerを使用して5つのタブ間をスワイプしました。各タブには、oncreateview メソッドで呼び出される asynctask を含むフラグメントがあります。あるフラグメントにいるとき、他のフラグメントの asynctask が呼び出されています。

oncreateview メソッドでトースト メッセージを使用してみましたが、asynctask ではなく各フラグメントです。しかし、間違ったフラグメントで間違ったトースト メッセージが発行されています。

Oncreate メソッド コード:

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


}

Fragemnt クラスコード:

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

4 に答える 4

1

ViewPager現在のページに隣接するフラグメントのビューを作成します。これにより、隣接するフラグメントに必要なデータをロードする機会も得られます。AsyncTasks を使用してデータをロードしている場合、この機能を使用するとユーザー エクスペリエンスが向上します。しかし、ビューページャーによって特定のページが開かれたときにイベントが必要な場合は、LordRaydenMK のソリューションが機能します。

ViewPager で AsyncTasks を使用する方法については、次のスレッドの私の投稿を参照してください。

AsyncTask は ViewPager の各ページで実行されます

于 2014-06-28T21:46:25.767 に答える
1

これを使って

viewPager.setOffscreenPageLimit(1); // the number of pages you want to load in background

そしてまたProgressDialogue

于 2014-06-24T11:37:20.737 に答える
1

こんにちは 各フラグメントのタグを使用して、各フラグメントのメソッドを Page Changed で呼び出すことで試すことができます

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                        actionBar.setTitle(getHomePageTitle(position));
                        Fragment f = getFragrmentManager().findFragmentByTag(
                                "" + position);
                        if (f != null)
                            f.refresh();
                    }
                });

そして

         @Override
        public Fragment getItem(int position) {
          Fragment f=null;

        switch (position) 
        {
            case 0:
                f = new Fragment1(); 
                break;

            case 1:
                 f = new Fragment2(); 
                 break;

            case 2:
                 f = new Fragment3();  
                 break;

            case 3: 
                f = new Fragment4();
                break;


            case 4: 
                 f = new Fragment5();
                break;

            }
             f.setTag(""+position);
            return f;

        }
于 2014-06-30T12:47:15.723 に答える