我正在开设一款Wear应用,并有GridViewPager
来展示多个Fragment
。在我的Activity
中,我希望能够更新Fragment
:
public class LocationFragment extends Fragment {
TextView tvHead;
public void setLocation(String l) {
tvLocation.setText(location);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_location, container, false);
tvLocation = (TextView)rootView.findViewById(R.id.tvLocation);
return rootView;
}
}
片段已创建并添加到我的活动onCreate()
中的网格视图中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pages);
pager = (GridViewPager) findViewById(R.id.pager);
MyGridPagerAdapter gridPagerAdapter = new MyGridPagerAdapter(this, getFragmentManager());
frLocation = new LocationFragment();
gridPagerAdapter.add(0, frLocation);
pager.setAdapter(gridPagerAdapter);
}
在onResume
中,我调用了一些网络操作,这会导致调用frLocation.setLocation()
,但此调用可以在 onCreateView
之前,导致应用程序使用NullPointerException
崩溃(因为tvLocation
尚未设置)。
我该如何设置?
答案 0 :(得分:1)
通常,活动不应该包含对片段的引用(我假设你正在使用frLocation),反之亦然,因为生命周期事件会创建它们以便重新创建,然后引用不再有效(甚至可能导致内存泄漏) )。
至于您的具体问题,我建议该活动将保留网络调用的结果并公开该片段的接口。
当片段的onCreateView()被调用时,它将检查活动的值并在值有效时更新文本。至于另一个方向(数据在片段视图创建后更新),它有点棘手。片段可以注册自己以在创建视图时监听更改,并在视图被销毁时取消注册(这样,当网络调用完成时,您可以确定TextView是有效的。)