从 Activity 的 onCreate 访问片段视图

Access Fragment View from Activity's onCreate

提问人:Dan 提问时间:8/25/2012 最后编辑:John CondeDan 更新时间:9/2/2012 访问量:40477

问:

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

其他线程建议这是因为 尚未膨胀,因此对于 中包含的任何视图都将返回 null。FragmentfindViewById()Fragment

这就是我的意思:

活动:

@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");
}

片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
System.out.println("fragment onCreateView");
    return inflater.inflate(R.layout.event_log, container, false);
}

这将打印结果:

活动 onCreate(创建) 活动结束 onCreate 片段 onCreateView

由于这个顺序,任何尝试访问 的视图 in 的 方法(使用 ) 都会产生一个 ,因为 's 只有在 的末尾才会被调用。FragmentActivityonCreate()findViewById()NullPointerExceptionFragmentonCreateView()ActivityonCreate()

添加 后使用 's 无济于事。FragmentMangerexecutePendingTransactions()Fragment

基本上,我被迫将问题代码放在 的方法中,而不是像 之后发生的那样。ActivityonStart()onCreate()onStart()FragmentonCreateView()

有没有人知道这里的标准做法是什么,或者我如何让我的 Fragment-View 访问代码在 的方法中工作?ActivityonCreate()

Android 片段 oncreate findviewbyid

评论

1赞 biegleux 8/25/2012
为什么要在 的方法中访问 的视图?你的设计有问题。FragmentActivityonCreate()
0赞 Dan 8/25/2012
具体来说,在 Activity 的 onCreate() 方法中添加 Fragment 后,我想更改 Fragment 中包含的 TextView 的文本,并将一些项目添加到微调器中。我的设计可能有什么问题?
0赞 biegleux 8/25/2012
而不是在 的方法中更新片段的布局。看我的答案。FragmentonCreateView()

答:

26赞 biegleux 8/25/2012 #1

更新 中的视图。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;
}

或者,如果您的更改取决于您的附加到,请使用 .ActivityFragmentonActivityCreated()

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

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

评论

0赞 Dan 8/28/2012
好的,在经历了一百万个我不会深入探讨的其他问题之后,我终于让它正常工作了!谢谢你的帮助。
1赞 Mike Mackintosh 9/13/2012
@Dan,您能否分享一下其他问题以及您如何使用上述方法解决它?这将是对社区的一大贡献。
1赞 Dan 9/13/2012
基本上,我尝试使用 onActivityCreated() 来初始化我的组件,认为这个方法只会被调用一次。这在暂停和重新启动我的应用程序时导致了很多问题,因为这种方法正在重置我的所有组件,因为它每次都会被调用。然后,当尝试使用 onCreateView() 完成这项工作时,我使用了 getView().findViewById(...) 而不是使用已经初始化的“view”变量。这是一个愚蠢的错误,但我最终到达了那里!因此,现在文本被存储到 onCreate() 中的字段中,并放入 onCreateView() 中的 TextView 中。
0赞 Dr.jacky 7/19/2014
请参阅我的相关问题:stackoverflow.com/questions/24833912/...