获取当前片段的实例在viewpager [英] Getting the current Fragment instance in the viewpager
问题描述
下面是我的code具有 3片段班
每个嵌入每个上 ViewPager
。我有一个菜单选项。如图中 onOptionsItemSelected()
,通过选择一个选项,我需要更新当前可见的片段。要更新,我要叫这是在片段类中的方法。可有人请建议如何调用该方法?
公共类MainActivity扩展ActionBarActivity { ViewPager ViewPager;
TabsAdapter TabsAdapter; @覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState); ViewPager =新ViewPager(本);
ViewPager.setId(R.id.pager);
的setContentView(ViewPager); 最后的动作条酒吧= getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //附加的选项卡片段类和设置选项卡标题。
TabsAdapter =新TabsAdapter(这一点,ViewPager);
TabsAdapter.addTab(bar.newTab()。的setText(FragmentClass1),
FragmentClass1.class,NULL);
TabsAdapter.addTab(bar.newTab()。的setText(FragmentClass2),
FragmentClass2.class,NULL);
TabsAdapter.addTab(bar.newTab()。的setText(FragmentClass3),
FragmentClass3.class,NULL);
如果(savedInstanceState!= NULL){
bar.setSelectedNavigationItem(savedInstanceState.getInt(标签,0));
} } @覆盖
公共布尔onOptionsItemSelected(菜单项项){ 开关(item.getItemId()){ 案例R.id.addText: ** //这里我需要调用它存在于当前可见的片段类中的方法** 返回true; } 返回super.onOptionsItemSelected(项目);
}
@覆盖
保护无效的onSaveInstanceState(捆绑outState){
super.onSaveInstanceState(outState);
outState.putInt(标签,getSupportActionBar()getSelectedNavigationIndex()); } 公共静态类TabsAdapter扩展FragmentPagerAdapter
实现ActionBar.TabListener,ViewPager.OnPageChangeListener { 私人最终上下文mContext;
私人最终动作条mActionBar;
私人最终ViewPager mViewPager;
私人最终的ArrayList< TabInfo> mTabs =新的ArrayList< TabInfo>(); 静态final类TabInfo {
私人最终级<> CLSS;
私人最终捆绑ARGS; TabInfo(类<> _class,捆绑_args){
CLSS = _class;
ARGS = _args;
}
} 公共TabsAdapter(ActionBarActivity活动,ViewPager寻呼机){
超级(activity.getSupportFragmentManager());
mContext =活动;
mActionBar = activity.getSupportActionBar();
mViewPager =寻呼机;
mViewPager.setAdapter(本);
mViewPager.setOnPageChangeListener(本);
} 公共无效addTab(ActionBar.Tab标签,类<> CLSS,捆绑参数){
TabInfo信息=新TabInfo(CLSS,参数);
tab.setTag(信息);
tab.setTabListener(本);
mTabs.add(信息);
mActionBar.addTab(标签);
notifyDataSetChanged(); } @覆盖
公共无效onPageScrollStateChanged(INT状态){
// TODO自动生成方法存根 } @覆盖
公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
// TODO自动生成方法存根 } @覆盖
公共无效使用onPageSelected(INT位置){
// TODO自动生成方法存根
mActionBar.setSelectedNavigationItem(位置);
} @覆盖
公共无效onTabReselected(标签选项卡,FragmentTransaction英尺){
// TODO自动生成方法存根 } @覆盖
公共无效onTabSelected(标签选项卡,FragmentTransaction英尺){
对象标记= tab.getTag();
的for(int i = 0; I< mTabs.size();我++){
如果(mTabs.get(ⅰ)==标签){
mViewPager.setCurrentItem(ⅰ); }
} tabPosition = tab.getPosition();
} @覆盖
公共无效onTabUnselected(标签选项卡,FragmentTransaction英尺){
// TODO自动生成方法存根 } @覆盖
公共片段的getItem(INT位置){
TabInfo信息= mTabs.get(位置);
返回Fragment.instantiate(mContext,info.clss.getName(),info.args);
} @覆盖
公众诠释的getCount(){
返回mTabs.size();
} } }
假设下面是该方法的片段类 updateList()
我要打电话:
公共类FragmentClass1 { ArrayList的<串GT; originalData;
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
捆绑savedInstanceState){ 查看fragmentView = inflater.inflate(R.layout.frag1,集装箱,FALSE); originalData = getOriginalDataFromDB(); 返回fragmentView; }
公共无效updateList(字符串文本)
{
originalData.add(文本);
//这里我能做到这一点需要添加其他UI部分
}
}
选择一个选项,我需要更新的是片段
目前可见的。
块引用>这样做的一个简单的方法是使用关系到
FragmentPagerAdapter
实施一招:情况下R.id.addText:
片段页= getSupportFragmentManager()findFragmentByTag(机器人:切换:+ R.id.pager +:+ ViewPager.getCurrentItem());
//基于当前位置,然后,就可以把网页调整
//类并调用方法:
如果(ViewPager.getCurrentItem()== 0安培;&安培;!页= NULL){
((FragmentClass1)页).updateList(新项目);
}
返回true;请重新考虑你的变量命名约定,使用作为变量名的类的名称很混乱(所以没有
ViewPager ViewPager
,使用ViewPager mPager
为例)。Below is my code which has
3 Fragment classes
each embedded with each of the 3 tabs onViewPager
. I have a menu option. As shown in theonOptionsItemSelected()
, by selecting an option, I need to update the fragment that is currently visible. To update that I have to call a method which is in the fragment class. Can someone please suggest how to call that method?public class MainActivity extends ActionBarActivity { ViewPager ViewPager; TabsAdapter TabsAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewPager = new ViewPager(this); ViewPager.setId(R.id.pager); setContentView(ViewPager); final ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //Attaching the Tabs to the fragment classes and setting the tab title. TabsAdapter = new TabsAdapter(this, ViewPager); TabsAdapter.addTab(bar.newTab().setText("FragmentClass1"), FragmentClass1.class, null); TabsAdapter.addTab(bar.newTab().setText("FragmentClass2"), FragmentClass2.class, null); TabsAdapter.addTab(bar.newTab().setText("FragmentClass3"), FragmentClass3.class, null); if (savedInstanceState != null) { bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.addText: **// Here I need to call the method which exists in the currently visible Fragment class** return true; } return super.onOptionsItemSelected(item); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { private final Class<?> clss; private final Bundle args; TabInfo(Class<?> _class, Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(ActionBarActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub } @Override public void onPageSelected(int position) { // TODO Auto-generated method stub mActionBar.setSelectedNavigationItem(position); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { Object tag = tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } tabPosition = tab.getPosition(); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } @Override public int getCount() { return mTabs.size(); } } }
Suppose below is the fragment class with the method
updateList()
I want to call:public class FragmentClass1{ ArrayList<String> originalData; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragmentView = inflater.inflate(R.layout.frag1, container, false); originalData = getOriginalDataFromDB(); return fragmentView; } public void updateList(String text) { originalData.add(text); //Here I could do other UI part that need to added } }
解决方案by selecting an option, I need to update the fragment that is currently visible.
A simple way of doing this is using a trick related to the
FragmentPagerAdapter
implementation:case R.id.addText: Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + ViewPager.getCurrentItem()); // based on the current position you can then cast the page to the correct // class and call the method: if (ViewPager.getCurrentItem() == 0 && page != null) { ((FragmentClass1)page).updateList("new item"); } return true;
Please rethink your variable naming convention, using as the variable name the name of the class is very confusing(so no
ViewPager ViewPager
, useViewPager mPager
for example).这篇关于获取当前片段的实例在viewpager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!