3

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

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

在活动中,我有一个按钮和一个 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。

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

提前致谢。

4

1 回答 1

2

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

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

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

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

如果您嵌套片段类,请将其设为静态,这样您就不会将其绑定到活动对象。Fragment除了默认构造函数之外,不要为 a 创建构造函数。如果框架需要重新创建片段,它将调用默认构造函数,如果它不可用,则会抛出异常。例如,尝试更改手机/模拟器的方向并查看会发生什么(这是 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;
    }

文本将MyFragment通过使用getArguments().getString("content");

于 2012-09-10T14:33:15.533 回答