30

我正在为 Android 制作我的第一个应用程序,并且我在's方法中Fragment添加了一个。我面临的问题是我无法找到from的方法中包含的任何视图。ActivityActivityonCreate()FragmentActivityonCreate()

其他线程建议这是因为Fragment尚未膨胀,因此findViewById()对于包含在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

由于这个顺序,任何访问'方法Fragment中的视图的尝试(使用)都会产生一个,因为's只会在 's 结束后被调用。ActivityonCreate()findViewById()NullPointerExceptionFragmentonCreateView()ActivityonCreate()

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

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

有人知道这里的标准做法是什么,或者我如何使我的片段视图访问代码在Activity'sonCreate()方法中工作?

4

1 回答 1

25

更新您的观点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;
}

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

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

    TextView tv = (TextView) getView().findViewById(R.id.text);
    tv.setText(getActivity.getSomeText());
}
于 2012-08-25T15:28:58.640 回答