我正在尝试通过单击按钮来更改viewpager片段。我有5个片段,每个片段都有自己的xml文件(frag1.xml,frag2.xml等)。每个片段都有5个按钮,应该转到viewpager的其他页面。但问题是我如何检查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;
}
}
MainActivity
公共类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;
}
}
这样的事情可能吗?有人可以帮我找到正确的方向吗?
答案 0 :(得分: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);
}
}
希望有所帮助〜
答案 1 :(得分:6)
我发布了一个新的答案,因为 - 从我所看到的 - 真正的答案是对接受的答案的评论:
“你有2种方法.1)将你的ViewPager对象作为公共静态,以便你可以访问你的任何片段.2)将你的ViewPager作为FragmentActivity的成员保存,发送你的广播意图Fragment to FragmentActivity,并访问您的ViewPager对象。 - RRTW 2013年5月28日2:18“
感谢RRTW的回答,但我想改进它。
1)不是一种选择。片段的目的是可重用的,因此它们需要与Activity无关。将它们与活动联系起来我认为是一种不好的做法,即使 - 现在 - 你没有在其他活动中重复使用它。
2)听起来很不错,但我认为需要更多解释。 getAcitivty()。sendBroadcast()的目的是将事件发送到用户系统的所有应用程序。这绝对不是你想要达到的目标。因此,从我的观点来看,好的答案是使用LoacalBroadcastManager,您可以查看that post以了解如何使用它。
答案 2 :(得分:-1)
在主要的调用中,使您的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);
}