【问题标题】:Communicate between Activity and ViewPager Fragments在 Activity 和 ViewPager 片段之间进行通信
【发布时间】:2016-04-22 16:27:13
【问题描述】:

如下图所示,我有一个Activity,里面有一个ViewPager(带有TabLayout)。 现在我想刷新例如TextViewViewPager Fragment 中的文本。我该怎么做?

http://imgur.com/0kWQCfx [对不起图片链接,但我还没有足够的声誉。]

我已经尝试过这样的事情:

//In Activity
View root = getLayoutInflater().inflate(R.layout.fragment_home, null);
TextView textView = (TextView) root.findViewById(R.id.text_view);
textView.setText("test");

但我得到一个 NullPointerException 用于 textView。

编辑 1: 我只需要访问一个 Fragment 中的组件,因此我没有在 Adapter 中使用数组。 我将我的ViewPagerAdapter 更改为:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    public HomeFragment fragment;

    ...

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return fragment = new HomeFragment();
            case 1:
                ...
            default:
                return null;
        }
    }

但我仍然在这里收到NullPointerException

final Fragment root = viewPagerAdapter.fragment;
Log.d("testtest", String.valueOf(root == null));

【问题讨论】:

  • 您想从活动中更改片段的文本视图值吗?
  • @NazmulHasanMasum 是的,你明白我的意思
  • 或许你可以告诉我,在 viewpager 中更新 textview 的 Activity 到底发生了什么?

标签: android android-fragments android-activity android-viewpager


【解决方案1】:

在您想要更改片段值的活动中编写此代码。您的片段 id 是例如我的片段

Fragment frag = getFragmentManager().findFragmentById(R.id.my_fragment)
((TextView) frag.getView().findViewById(R.id.text_view)).setText(s);

【讨论】:

    【解决方案2】:

    您可以创建自己的适配器:

    private class YourAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener
    {
        Fragment screens[];
        public CheckinHistoryAdapter(FragmentManager fm) {
            super(fm);
            screens = new Fragment[3];
            screens[0] = new CoachFragment();
            screens[1] = new LogingFragment();
            screens[2] = new HistoryFragment();
        }
    
    @Override
    public Fragment getItem(int index) {
        if(index <= screens.length)
        {
            return screens[index];
        }
        return null;
    }
    
    @Override
    public int getCount() {
        return screens.length;
    }
    
    }
    

    这样使用

    mViewPager.setAdapter(this.mPagerAdapter);
    

    您可以使用 getItem 方法访问片段对象。

    【讨论】:

      【解决方案3】:

      如果您只需要一个 Fragment 的引用,那么只需使用传递给 instantiateItem()position 参数,并且只将您的 Fragment 引用分配给所需的位置:

      public class ViewPagerAdapter extends FragmentPagerAdapter {
          public HomeFragment fragment;
      
          //...
      
          @Override
          public Fragment getItem(int position) {
              switch (position) {
                  case 0:
                      return new HomeFragment(); //modified
                  case 1:
                      ...
                  default:
                      return null;
              }
          }
      
          @Override
          public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            if (position == 0) {
              fragment = (HomeFragment) createdFragment;
            }
            return createdFragment;
          }
      }
      

      【讨论】:

      • 我仍然得到一个NullPointerException: java.lang.NullPointerException: Attempt to read from field 'android.view.View de.ccb.weighttracker.fragment.HomeFragment.rootView on a null object reference`
      • 我可能正在尝试与未完全设置的 ViewPager 片段视图通信。什么时候第一次在没有 Fragment 为 null 的情况下进行通信?
      • 目前我正在通过我的活动的onCreate() 进行交流。我百分百确定,这是我的问题。我测试过了。
      • 一切正确,请相信我并回答问题
      • "第一次通信是什么时候没有Fragment为空的可能性?"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多