gpt4 book ai didi

android - 从 ViewPager 中的 Activity 更新 fragment

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:44 25 4
gpt4 key购买 nike

我是 Android 开发的新手,非常感谢这里的一些帮助。

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

在 Activity 中,我有一个按钮和一个 ViewPager,我需要按钮来更新所有 fragment 实例的内容,无论何时单击它。

这是 Activity

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]);
}
}
});
}
}

fragment

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 的 fragment 时,OnClick 方法都会给我一个 NullPointerException。

关于如何同时更新所有 fragment 的任何想法?

提前致谢。

最佳答案

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

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

您仍然可以使用我评论中的方法和方法 onPageScrollStateChanged(因此更新将在用户开始滑动时开始)以查看用户何时开始滑动寻呼机并更新当前可见 fragment 左侧和右侧的 fragment ,但这将有点难以正确,因此我建议使用第一个选项。

关于包含 fragment 的代码的一些要点:

如果嵌套 fragment 类,请将其设为静态,这样就不会将其绑定(bind)到 Activity 对象。除了默认构造函数之外,不要为 Fragment 创建构造函数。如果框架需要重新创建 fragment ,它将调用默认构造函数,如果它不可用,它将抛出异常。例如,尝试改变手机/模拟器的方向,看看会发生什么(这是 Android 将重新创建 fragment 的情况之一)。最后,为 ViewPager 的适配器使用自定义名称,您使用 PagerAdapter 这是 FragmentViewPager 的父类(super class)的名称,它非常让阅读您的代码的人感到困惑。

如果您需要将数据传递给 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 中可用

关于android - 从 ViewPager 中的 Activity 更新 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com