在ViewPager中从Activity更新片段

3

我刚开始学习Android开发,希望能得到一些帮助。

我正在使用一个包含TextView的片段,并且我正在使用5个相同的MyFragment类实例。

在活动中,我有一个按钮和一个ViewPager,每当按钮被点击时,我需要更新所有片段实例的内容。

这是活动:

public class MainActivity extends FragmentActivity {

final static String[] CONTENT = {"a", "b"};
ViewPager pager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<MyFragment> fragments = new Vector<MyFragment>();
    for(int i = 0; i < 5; i++){
        MyFragment fragment = new MyFragment(CONTENT);
        fragments.add(fragment);
    }
    PagerAdapter adapter = new PagerAdapter(this.getSupportFragmentManager(), fragments);
    pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setAdapter(adapter);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //method that isn't working
            PagerAdapter adapter = (PagerAdapter)pager.getAdapter();
            for(int i = 0; i < 5; i++){
                MyFragment fragment = (MyFragment) adapter.getItem(i);
                fragment.textView.setText(fragment.content[1]);
            }
        }
    });
}
}

片段

public class MyFragment extends Fragment{

String[] content;
    TextView textView;

public MyFragment(String[] content) {
    this.content = content;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_content, container, false);
    textView = (TextView) view.findViewById(R.id.textView1);
    textView.setText(content[0]);
    return view;
}

}

还有FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter{

List<MyFragment> fragments;

public PagerAdapter(FragmentManager fm, List<MyFragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

@Override
public Fragment getItem(int arg0) {
    return fragments.get(arg0);
}

@Override
public int getCount() {
    return fragments.size();
}

}

当我试图从适配器中访问小于adapter.getCurrentItem() - 1或大于adapter.getCurrentItem() + 1的片段时,OnClick方法会给我一个NullPointerException。

有没有想法如何同时更新所有片段?

提前致谢。


您可以修改当前可见项,然后添加一个 OnPageChangeListenerViewPager 上,并在用户向左或向右滑动时更新其他子片段。 - user
1
那个很好用。我已经实现了onPageSelected,但是还有一个问题,就是当我开始在页面之间滚动时,直到我释放后下一个片段才会更新。我认为可以通过onScrollStateChanged来解决,但目前还没有什么进展。有什么建议吗? - Helios
1个回答

2

更新这些片段最简单的方法是使用您的代码,并将ViewPager在内存中保持的片段数设置为总片段数-1(因此无论您在哪个页面,所有片段都是有效的)。 在您的情况下:

pager.setOffscreenPageLimit(4); // you have 5 elements

您仍然可以使用我评论中的方法和onPageScrollStateChanged方法(因此更新将在用户开始滑动时开始)来查看用户何时开始滑动页面,并更新当前可见片段左侧和右侧的片段,但这可能有些难以正确实现,因此建议选择第一种选项。
关于您包含片段的代码,有几点需要注意:
如果嵌套片段类,请将其设置为静态,以便不将其绑定到活动对象。除默认构造函数外,请勿为Fragment创建构造函数。如果框架需要重新创建片段,则会调用默认构造函数,如果不可用,则会引发异常。例如,尝试更改手机/模拟器的方向并查看会发生什么(这是Android重新创建片段的情况之一)。最后,请使用自定义名称作为ViewPager的适配器,您使用了PagerAdapter,它是FragmentViewPager的超类的名称,对于阅读您的代码的人来说非常混乱。
如果您需要将数据传递给Fragment,则可以使用下面的创建方法:
public static MyFragment newInstance(String text) {
        MyFragment f = new MyFragment();
        Bundle b = new Bundle();
        b.putString("content", text);
        f.setArguments(b);
        return f;
    }

通过使用getArguments().getString("content");,可以在MyFragment中获取文本。


非常感谢!我会解决这些问题。顺便说一下,ViewPager只是我在这里发布时给我的实际类起的任意名称。无论如何,感谢您指出这一点,我会记住的。再次感谢所有的建议。 - Helios
我在处理相同的片段时遇到了麻烦。你能帮忙吗?如果我用adb杀掉应用程序,我会得到一个错误,因为f.getArguments返回null。我尝试在onCreate、onActivityCreated和其他一些地方设置这些参数,但它们都没有起作用。我知道我需要设置它们,但不确定在哪里设置。我会非常感激。 - Helios
@Helios 首先,您应该创建一个新问题并在那里发布相关的代码片段。我不完全理解您正在做什么,但如果您关闭应用程序,则需要将片段的状态保存到某个永久性存储(数据库)或Bundle(使用onSaveInstanceState)。 - user
@Luksprog,我需要你的帮助。当我尝试访问FragmentActivity中TextView的ID时,它返回null,导致我无法设置fragment的TextView。我正在使用ViewPager来显示六个fragments。 - Abhijit Chakra
@Abhijit,请发布一个新问题,详细说明你的代码。仅凭上述内容无法帮助你。 - user
我的意思是我不能在FragmentActivity中设置我的碎片的TextView。在StackOverflow上,它不允许我发布问题,这就是为什么我写在评论中的原因。 - Abhijit Chakra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接