【发布时间】:2019-08-19 01:19:20
【问题描述】:
我有一个包含多个片段的 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() 方法中,我得到一个异常。
【问题讨论】:
-
首先尝试在
onCreate方法中查找TextView(你不应该这样做)是不正确的,因为Fragments在那里不可用。如果此时需要设置文字,那么直接在片段类中移动文字的设置即可。 -
片段(以及电视)第一次可用是什么时候?活动完全运行后(onResume 后)?也许这只是我的设计问题。我想显示一些我从互联网上获取的数据。我从创建 Activity、Viewpager 和 Fragments 开始。之后,我启动一个 AsyncTask 以从 Internet 获取数据并将解析的数据写入 AsyncTask 的 onPostExecute() 方法中的 TextViews。
-
如果这就是你正在做的事情,我会在你的答案中选择解决方案。正如您需要为所有(我认为)片段设置
TextView一样,只需重建它们即可。在onResume方法中,片段应该是可用的。
标签: android android-fragments android-viewpager