11

ボタンをクリックして、viewpager フラグメントを変更しようとしています。5 つのフラグメントがあり、各フラグメントには独自の xml ファイル (frag1.xml、frag2.xml など) があります。すべてのフラグメントには、viewpager の他のページに移動する 5 つのボタンがあります。しかし問題は、クリックされたボタンとそこに到達する方法を FragmentPageAdapter にチェックインする方法です。

私が持っているコードを表示すると、それは明確になるはずです。下部にドットがあるホーム画面のようなものだと考えてください。特定のドットをクリックすると、対応する画面に移動します。

FragmentPagerAdapter

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    final int PAGE_COUNT = 6;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {

        switch(arg0){

        case 0:

            return new Fragment1();

        case 1:
            return new Fragment2();

        case 2:
            return new Fragment3();

        case 3:
            return new Fragment4();

        case 4:
            return new Fragment5();

        default:
            return null;

        }       
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }
}

Frag1.java

public class Frag1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag_one, container, false);


        OnClickListener changeFrag = new OnClickListener() {            
            @Override
            public void onClick(View v) {
            /*When I click this button in my fragment, I'd like it to go to fragment 3 for example*/
            }
        };

        ImageButton btnT = (ImageButton) v.findViewById(R.id.frag3);
        btnT.setOnClickListener(changeFrag);

        return v;
    }
}

主な活動

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);/** Getting a reference to the ViewPager defined the layout file */
        ViewPager pager = (ViewPager) findViewById(R.id.pager);

        /** Getting fragment manager */
        FragmentManager fm = getSupportFragmentManager();

        /** Instantiating FragmentPagerAdapter */
        MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the pagerAdapter to the pager object */
        pager.setAdapter(pagerAdapter);

       //pager.setPageTransformer(true, new ZoomOutPageTransformer());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

このようなことは可能ですか?誰かが私を正しい方向に助けてくれますか?

4

3 に答える 3

23

「変更」について正確に何を言ったのかわかりません。

ページ表示インデックスの変更について質問している場合は、試すことができます

ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll);

または、変更内容について質問している場合は、次のことを行いました。

public class MyPagerAdapter extends FragmentStatePagerAdapter
{
  private FragmentManager fragMan;
  private ArrayList<Fragment> fragments=new ArrayList<Fragment>();

  public void clearAll() //You can clear any specified page if you want...
  {
    for(int i=0; i<fragments.size(); i++)
    fragMan.beginTransaction().remove(fragments.get(i)).commit();
    fragments.clear();
    fragments=new ArrayList<Fragment>();
    notifyDataSetChanged();
  }

  public void addList() //Add some new fragment...
  {
    listFrag=new ListFragment();
    fragments.add(list);
  }
}

それが役立つことを願って〜

于 2013-05-27T09:24:55.913 に答える
6

私が見ることができるものから、本当の答えは受け入れられた答えのコメントにあるので、私は新しい答えを投稿しています:

「あなたには2つの方法があります。1)ViewPagerオブジェクトをpublic staticとして配置して、どのフラグメントでもアクセスできるようにします。2)ViewPagerをFragmentActivityのメンバーとして保持し、FragmentからFragmentActivityにブロードキャストインテントを送信します、ViewPagerオブジェクトにアクセスします。 – RRTW 28 5月. 132:18 に "

その答えをくれたRRTWに感謝しますが、改善したいと思います。

1) オプションではありません。フラグメントの目的は再利用可能であるため、アクティビティから独立している必要があります。それらをアクティビティにリンクすることは、たとえ今のところ他のアクティビティで再利用していなくても、悪い習慣だと思います。

2) とても良さそうですが、もっと説明が必要だと思います。getAcitivty().sendBroadcast() の目的は、ユーザーのシステムのすべてのアプリケーションにイベントを送信することです。それは間違いなくあなたが達成したいことではありません。したがって、私の観点からすると、良い答えは LoacalBroadcastManagerを使用することです。その投稿を見て、その使用方法を理解することができます。

于 2015-06-13T10:44:32.713 に答える