我在哪里定义片段中的视图?

时间:2016-10-27 14:54:33

标签: android android-fragments wear-os

我正在开设一款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尚未设置)。

我该如何设置?

1 个答案:

答案 0 :(得分:1)

通常,活动不应该包含对片段的引用(我假设你正在使用frLocation),反之亦然,因为生命周期事件会创建它们以便重新创建,然后引用不再有效(甚至可能导致内存泄漏) )。

至于您的具体问题,我建议该活动将保留网络调用的结果并公开该片段的接口。

当片段的onCreateView()被调用时,它将检查活动的值并在值有效时更新文本。至于另一个方向(数据在片段视图创建后更新),它有点棘手。片段可以注册自己以在创建视图时监听更改,并在视图被销毁时取消注册(这样,当网络调用完成时,您可以确定TextView是有效的。)