通过按钮更改 viewpager 片段 Click
Posted
技术标签:
【中文标题】通过按钮更改 viewpager 片段 Click【英文标题】:Change viewpager fragment by a buttonClick 【发布时间】:2013-05-21 15:20:49 【问题描述】:我正在尝试通过单击一个按钮来更改 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;
这样的事情可能吗?有人可以帮助我朝正确的方向前进吗?
【问题讨论】:
这样吗? ***.com/questions/39500413/… 【参考方案1】:我不确定你对“改变”的确切说法。
如果你问的是改变页面显示索引,你可以试试
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);
希望对你有帮助~
【讨论】:
确实,说的是改变页面显示索引。我应该把ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll);
你有两种方法可以做。 1)将您的 ViewPager 对象作为公共静态对象,以便您可以在任何 Fragment 中访问。 2) 让您的 ViewPager 作为 FragmentActivity 的成员,将广播意图从您的 Fragment 发送到 FragmentActivity,并访问您的 ViewPager 对象。
mXX,是否有可能获得允许您解决此问题的代码?我有同样的问题,但找不到从我的片段中获取 ViewPager 的方法。非常感谢!【参考方案2】:
我发布了一个新答案,因为 - 据我所知 - 真正的答案是对已接受答案的评论:
“您有两种方法可以做。1) 将您的 ViewPager 对象作为公共静态对象,以便您可以在任何 Fragment 中访问。2) 将您的 ViewPager 作为您的 FragmentActivity 的成员,从您的片段到 FragmentActivity,并访问您的 ViewPager 对象。– RRTW 2013 年 5 月 28 日 2:18"
感谢 RRTW 的回答,但我想改进它。
1) 不是一个选项。片段的目的是可重用,因此它们需要独立于 Activity。我认为将它们与活动联系起来是一种不好的做法,即使 - 目前 - 你没有在其他活动中重复使用它。
2) 听起来很不错,但我认为需要更多解释。 getAcitivty().sendBroadcast() 的目的是向用户系统的所有应用程序发送事件。这绝对不是你想要达到的。所以从我的角度来看,好的答案是使用 LoacalBroadcastManager,您可以查看that post 以了解如何使用它。
【讨论】:
加一个用于静态公共寻呼机 感谢您的解释,我知道#1 是一个糟糕的设计(仅适用于开发时间耗尽的项目)。关于#2,正如您所说,它是LocalBroadcast(仅在您自己的APP中),我也在我的APP项目中使用它。将其称为广播是我的错误。再次感谢您:-)【参考方案3】:在 main 中只需调用使您的 Viewpager 公开,以便可以从其他 java 文件(例如来自 frag1.java)访问它
MainActivity.Java:
public static ViewPager pager;
现在,在 frag1.java 中的 Onclick() 函数中,只需调用您的 mViewPager
并将 item(fragment) 设置为您要加载的任何片段。前任。如果要加载下一个片段,则将其设置为 2。
frag1.java
public void onClick(View v)
ViewPager.setCurrentItem(2);
【讨论】:
“在主要活动中公开查看器”?请问,封装的原理呢?这将完全违反该浏览器。假设我从一个活动 C 调用它,该活动 C 是从包含片段 B 的活动 A 转换而来的,在活动 C 中我们没有 viewpager,所以如果我们访问它,它不应该基于“范围的概念”为 null访问”?以上是关于通过按钮更改 viewpager 片段 Click的主要内容,如果未能解决你的问题,请参考以下文章