通过buttonClick更改viewpager片段

我试图通过点击一个button来改变viewpager片段。 我有5个片段,每个片段都有自己的XML文件(frag1.xml,frag2.xml等)。 每个片段有5个button应该去viewpager的其他页面。 但问题是如何检查FragmentPageAdapter哪个button被点击,以及如何到达那里?

我会显示我的代码,然后应该清楚我的想法。 把它看作是一个底部有点的主屏幕,我点击某个点,就会进入相应的屏幕。

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

主要活动

公共类MainActivity扩展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; } } 

是这样的可能吗? 有人能帮助我正确的方向吗?

Solutions Collecting From Web of "通过buttonClick更改viewpager片段"

我不确定你说的“改变”究竟是什么。

如果您询问更改页面显示索引,您可以尝试

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

希望它有助于〜

我发布了一个新的答案,因为 – 从我所能看到的 – 真正的答案是在接受的答案的评论:

2)将ViewPager保存为FragmentActivity的成员,从Fragment发送广播意图到FragmentActivity ,并访问您的ViewPager对象 – RRTW 13年5月28日在2:18“

所以感谢RRTW的答复,但我想改善它。

1)不是一个选项。 片段的目的是可重用的,所以它们需要与活动无关。 将他们联系起来是我认为是一种不好的做法,即使 – 现在 – 你不会在其他活动中重复使用它。

2)听起来很不错,但我认为需要更多的解释。 getAcitivty()。sendBroadcast()的目的是发送一个事件给用户系统的所有应用程序。 这绝对不是你想要达到的。 所以从我的观点来看,好的答案是使用LoacalBroadcastManager,你可以看看这篇文章 ,了解如何使用它。

主要是调用使您的ViewPager公开,以便从其他Java文件(例如来自frag1.java)

MainActivity.Java:

public static ViewPager pager;

现在,在frag1.java中的Onclick()函数中,只需调用你的mViewPager并将项目(片段)设置为你要加载的任何片段即可。 防爆。 如果你想加载下一个片段,那么你将它设置为2。

frag1.java

 public void onClick(View v) { ViewPager.setCurrentItem(2); }