更新后的FragmentStatePagerAdapter无法刷新Fragment。

3
我有一个Activity,里面包含两个Fragment。目前只设计了竖屏模式,在此模式下一次只能显示一个Fragment。我的应用中有ViewPager和Actionbar。
第一个(主要)Fragment中有一个按钮。当点击此按钮时,我需要在另一个Fragment上更新文本框或graphview。
我已经阅读了许多相关文章和帖子,但好像都缺少最后一英里的连接。这是我当前状态的一些详细信息:
- 我正在使用FragmentStatePagerAdapter。 - 目前正在覆盖getItemPosition以POSITION_NONE。我计划稍后进行优化。 - Fragment之间的通信通过Activity进行,通过接口实现。
问题在于,当我通过PageAdapter发送新值时,似乎没有传递到Fragment中。
适配器:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public String graphLink = "Last 24 Hours";

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment = null;
        Bundle args = null;
        switch (position) {
        case 0:
            fragment = new FragmentMain();
            args = new Bundle();
            args.putInt(FragmentMain.ARG_SECTION_NUMBER, position + 1);
            break;
        case 1:
            fragment = new FragmentGraph();
            args = new Bundle();
            args.putInt(FragmentGraph.ARG_SECTION_NUMBER, position + 1);
            args.putString(FragmentGraph.linkGraph, graphLink);
            break;
        }
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

在主fragment上点击按钮后,在监听方法中,我可以获取到更新的值直到activity处。然后我尝试执行以下操作:

SectionsPagerAdapter sa = (SectionsPagerAdapter) mViewPager
                .getAdapter();
        sa.graphLink = link;
        sa.notifyDataSetChanged();
        mViewPager.setAdapter(sa);
        mViewPager.setCurrentItem(1);

这应该会更新图形片段中的公共变量。 在其创建期间,该变量应该用于更新文本字段等。 但是最后一个部分不起作用,因为graphLink似乎没有通过。

以下是我的Graph片段的主要部分摘录:

 public class FragmentGraph extends Fragment {

    public static final String linkGraph = "Graph heading";

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

TextView graphHeader = (TextView) rootView.findViewById(R.id.graphHead);
graphHeader.setText(linkGraph);
}
}

我错了什么?在最后一步中,看起来我做了一些愚蠢的事情。 从另一个片段更新片段,这个方法正确吗?

1个回答

1

好的,我的愚蠢错误。是静态的final变量导致了问题。我将其更改为私有变量,并通过getter/setter公开,现在一切都完美地工作了。


为什么静态变量会成为一个问题? - Jono
2
我遇到了同样的问题。你只有一个最终静态变量,即linkGraph。那不可能是问题所在。你能解释一下哪个变量引起了问题吗? - Bagusflyer

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