获取当前片段的实例在viewpager [英] Getting the current Fragment instance in the viewpager

查看:193
本文介绍了获取当前片段的实例在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< mTab​​s.size();我++){
                    如果(mTabs.get(ⅰ)==标签){
                        mViewPager.setCurrentItem(ⅰ);                    }
                }                tabPosition = tab.getPosition();
      }      @覆盖
      公共无效onTabUnselected(标签选项卡,FragmentTransaction英尺){
       // TODO自动生成方法存根      }      @覆盖
      公共片段的getItem(INT位置){
       TabInfo信息= mTab​​s.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 on ViewPager. I have a menu option. As shown in the onOptionsItemSelected(), 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, use ViewPager mPager for example).

这篇关于获取当前片段的实例在viewpager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆