从Activity的onCreate方法中访问Fragment视图

30

我正在制作我的第一个Android应用程序,我的Fragment会在ActivityonCreate()方法中添加。我面临的问题是,我无法从ActivityonCreate()方法中找到Fragment中包含的任何视图。

其他线程建议这是因为Fragment还没有被填充,所以findViewById()将返回null,而不是Fragment中包含的任何视图。

这是我的意思:

Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    System.out.println("activity onCreate");
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        return;
    }

    initialiseUI(); // Fragment added to Activity

    System.out.println("end of activity onCreate");
}

碎片(Fragment):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
System.out.println("fragment onCreateView");
    return inflater.inflate(R.layout.event_log, container, false);
}
这打印出结果:
activity onCreate end of activity onCreate fragment onCreateView
由于这个顺序,任何在Activity的onCreate()方法中尝试访问Fragment视图(使用findViewById())的尝试都会产生NullPointerException,因为Fragment的onCreateView()只会在Activity的onCreate()结束之后调用。
在添加Fragment之后使用FragmentManager的executePendingTransactions()也没有帮助。
基本上,我被迫将问题代码放在Activity的onStart()方法中而不是onCreate()中,因为onStart()发生在Fragment的onCreateView()之后。
有人知道这里的标准做法吗?或者我如何使我的Fragment-View访问代码在Activity的onCreate()方法中工作?

1
дёәд»Җд№ҲдҪ жғіеңЁ Activity зҡ„ onCreate() ж–№жі•дёӯи®ҝй—® Fragment зҡ„и§ҶеӣҫпјҹиҝҷиҜҙжҳҺдҪ зҡ„и®ҫи®Ўжңүй—®йўҳгҖӮ - biegleux
具体来说,在Activity的onCreate()方法中添加一个Fragment后,我想要更改Fragment内部包含的TextView的文本,并向Spinner添加一些项目。我的设计可能有什么问题? - Dan
然后在FragmentonCreateView()方法中更新您的片段布局。请参阅我的答案。 - biegleux
1个回答

26

onCreateView() 中更新您的视图。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.event_log, container, false);
    TextView tv = (TextView) view.findViewById(R.id.text);
    tv.setText("hello world");
    return view;
}

如果你的更改取决于 Fragment 所依附的 Activity,请使用 onActivityCreated()

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    TextView tv = (TextView) getView().findViewById(R.id.text);
    tv.setText(getActivity.getSomeText());
}

好的,在经历了无数其它问题之后,我终于把这个程序正常工作了!感谢你的帮助。 - Dan
1
@Dan,你能分享一下其他问题的具体情况以及你如何使用上述方法来解决它吗?这将是对社区的巨大贡献。 - Mike Mackintosh
1
基本上,我尝试使用onActivityCreated()初始化我的组件,认为这个方法只会被调用一次。但是当暂停和重新启动应用程序时,这种方法会重置所有组件,因为它每次都会被调用,导致了很多问题。然后,当我尝试使用onCreateView()使其工作时,我使用了getView().findViewById(...)而不是使用已经初始化的“view”变量,这是一个愚蠢的错误,但最终我解决了这个问题!所以现在文本存储在onCreate()字段中,并在onCreateView()中放入TextView中。 - Dan
请查看我的相关问题:http://stackoverflow.com/questions/24833912/refresh-fragment-ui-from-fragmentactivity - Dr.jacky

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