在onCreateView()片段中设置动态布局

3

我使用,

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

          MyView myView = new MyView(getActivity());
          myView.addViews(getViews());
          return myView;
        }

我知道public void onActivityCreated (Bundle savedInstanceState){}onCreateView();之后被调用。

我需要使用onCreateView()中的上下文来填充自定义布局。如何在onActivityCreated()之前始终获得有效的上下文(使用getActivity())?

可能的解决方案:

View view;
@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

              view = inflater.inflate(R.layout.fragment, container, false); //Contains empty RelativeLayout       
              return view;
            }


    //Now that we have activity, create custom views and add it to the empty container
    public void onActivityCreated (Bundle savedInstanceState){
      RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.layout);
      MyView myView = new MyView(getActivity());
      layout.add(myView); 
    }

但是这种方法会增加一个额外的视图层次结构。

你可以创建一个构造函数,该构造函数从你的活动中获取上下文。 - Kostya Khuta
我不建议那样做。另外,所有的Fragment都需要有空构造函数。如果你想向一个Fragment传递对象,你可以使用静态工厂方法。 - Xaver Kapeller
它不一定会添加额外的视图层次结构。如果在片段中膨胀的布局仅包含您的自定义视图,则不会有额外的开销。我将编辑我的答案以澄清。 - Xaver Kapeller
2个回答

4
您可以使用与LayoutInflater相关联的Context对象:
MyView myView = new MyView( inflater.getContext() );

1

以下是生命周期调用的顺序:

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()
  • ...

onAttach() 方法结束后,getActivity() 方法返回有效的上下文。你可以在 onCreateView() 方法中安全地使用它。

onAttach()onActivityCreated() 之间的区别如下所示。在 onAttach() 之后,活动已创建但尚未完全初始化。例如,如果该活动中有几个片段,则它们尚未初始化。在 onActivityCreated() 之后,活动已完全初始化并且所有其片段都已创建。此时,您可以安全地执行片段间通信。


1
是的,但有时当我点击返回按钮时,在onCreate()中getActivity()会返回null。 - dcanh121
这样做永远不会可靠。请查看我的更新答案。 - Xaver Kapeller
@dcanh121 请查看 Google 的官方示例(搜索 TitlesFragment)。他们在 onActivityCreated() 中调用 getActivity(),这是非常可靠的。http://developer.android.com/reference/android/app/Fragment.html - sergej shafarenka
@beworker 没错。从onActivityCreated()调用getActivity()是可靠的,但从onCreateView()或onCreate()不可靠。 - dcanh121
@dcanh121 查看源代码:https://android.googlesource.com/platform/frameworks/base/+/android-4.3_r1/core/java/android/app/FragmentManager.java 第839行:设置活动实例, 第866行:调用onCreateView, 此时始终设置活动实例。 - sergej shafarenka
在 @beworker 的链接中,他们在 onCreateView() 中调用了 getActivity()。当他们在自己的文档中这样做时,仅仅为了获取一个 Context,使用 getActivity() 在那个时候真的不可靠吗?我不相信 xaver 在下面的回答中说“你不应该这样做”。 - user1978019

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