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

时间:2013-11-01 22:39:30

标签: android android-fragments

我用,

@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()中的上下文来扩充自定义布局。如何在getActivity()之前始终获得有效的上下文(使用onActivityCreated())?

可能的解决方案:

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用与Context相关联的LayoutInflater对象:

MyView myView = new MyView( inflater.getContext() );

答案 1 :(得分:1)

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

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

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

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