在活动上查找片段视图。 Android findFragmentByTag(String tag)返回null

时间:2012-04-01 18:15:25

标签: android view android-activity spinner fragment

我正在尝试从添加的Fragment到我的活动中获取Spinner视图,但似乎我无法获取片段或视图。

我有一个活动,它向Fragment添加LinearLayout,该片段的布局基于来自活动意图的'额外'。一切都正确显示,我可以看到片段的所有视图但由于某种原因,当我调用findFragmentByTag(String tag)时,它返回null,因此我不能调用getView()。

以下是我如何将片段代码添加到我的活动中:

...onCreate(){
    ...
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    Fragment fr = new Fragment(){
        @Override
        public View onCreateView(LayoutInflater inflater,
                ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(layoutID, container, false);
        }
    };
    ft.add(R.id.formsListActivity_Container, fr, "form_fragment_tag");

    ft.commit();
    ...

}

然后我尝试获取这样的片段并获得一个微调器视图来添加字符串数组:

Fragment f = fm.findFragmentByTag("form_fragment_tag");
Spinner spinner = (Spinner) f.getView().findViewById(R.id.city_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
        R.array.city_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

但是我得到一个null异常,因为findFragmentByTag()返回null

我做错了什么?我已经验证了几次代码并且标签是相同的。 我还确保spinner的id正确地位于XML布局文件中,并且片段正在加载正确的XML布局,因为我可以看到它(如果注释是从片段部分获取视图)。

3 个答案:

答案 0 :(得分:8)

我已经解决了这个问题,似乎基于活动和片段的生命周期,在onCreate()中执行findFragmentById()时,片段还没有“实际创建”,我测试了这通过向布局添加一个简单的按钮并创建一个方法,当单击按钮时,微调器将填充数据。

但是我当然不希望用户单击“加载”按钮来填充微调器,而是在我的片段上实现了public void onActivityCreated()方法。

这里参考我的片段代码:

 Fragment fr = new Fragment(){

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(layoutID, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Spinner spinner = (Spinner) this.getView().findViewById(R.id.city_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.city_list, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }

 };

答案 1 :(得分:2)

我遇到了同样的问题,我通过调用

中的findFragmentByTag()解决了这个问题
protected void onStart()
{
}

生命周期法。

答案 2 :(得分:0)

尝试将充气线中的false更改为true

return inflater.inflate(layoutID, container, true);