从Activity中访问ViewPager中的TextView

时间:2013-03-09 12:07:48

标签: android android-fragments android-viewpager

我有一个包含多个片段的ViewPager的Activity。我现在如何访问其中一个片段中的TextView以从主要活动中更改其文本?我尝试了多种方式,它们都以NullPointerException结束。

的活动:

public class SummonerOverview extends SherlockFragmentActivity implements TabListener, OnPageChangeListener {


    private ViewPager mPager;
    private PagerAdapter mAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.summoner_overview);

        initialize();   
    }

    private void initialize() {

        // initialize Pager
        mPager = (ViewPager) findViewById(R.id.viewpager);
        mAdapter = new PagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mAdapter);
        mPager.setCurrentItem(1);
        mPager.setOnPageChangeListener(this);


        }
}

PagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter {

    public PagerAdapter(FragmentManager fm) {
        super(fm);
        frags = new Fragment[3];
        frags[0] = new StatisticsFragment(0);
        frags[1] = new RatingsFragment(1);
        frags[2] = new HistoryFragment(2);
    }

    private final int NUM_PAGES = 3;
    Fragment[] frags;

    @Override
    public Fragment getItem(int arg0) {
        if (arg0 == 0)
            return frags[0];
        else if (arg0 == 1)
            return frags[1];
        else
            return frags[2];
    }
    @Override
    public int getCount() {
        return NUM_PAGES;
    }

}

碎片:

public class StatisticsFragment extends SherlockFragment {

public StatisticsFragment(int fragNr) {
        this.fragNr = fragNr;
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_overview_statistics, container, false);

        return v;
    }

}

StatisticsFragment中的Textview在fragment_overview_statistics.xml中标有id,但是当我尝试

TextView tv = (TextView) findViewById(R.id.id_of_the_textview)
tv.setText("text");

在initialize()方法之后的Activity的onCreate()方法中,我得到一个Exception。

1 个答案:

答案 0 :(得分:0)

好的,经过另一个小时的谷歌搜索后,我想我解决了自己的问题(虽然我确信有更好的方法可以解决这个问题)

我现在保存MainActivity中片段显示的所有数据,并通过使用活动的公共方法使Fragmets在onCreateView()方法中使用此数据。

在PagerAdapter中,我将getItemPosition()覆盖为:

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

现在,每当我更新一些数据时,我也会调用mAdapter.notifyDataSetChanged(),这会导致重新创建所有片段。

虽然对我来说看起来像是一个糟糕的黑客,但它确实有效。我确定必须有一个更好的解决方案,因为现在我必须重新创建所有片段来更改一个片段的一个TextView,这肯定不是它的目的。