2012-04-01 82 views
1

我想从一个添加的Fragment我的活动得到一个微调视图视图,但似乎我无法获得片段或视图。查找活动的片段视图。 Android的findFragmentByTag(字符串标签)返回null

我有一个Activity将Fragment加到它的LinearLayout,该片段的布局基于来自Activity意图的'extra'。一切正常显示,我可以看到片段的所有视图,但由于某种原因,当我打电话给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); 

但我得到一个空例外,因为findFragmentByTag()返回null

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

+0

我知道这篇文章已经过时了,但是如果你将'Fragment'放在自己的类中,事情就会简单得多。 – JDJ 2014-06-11 20:45:31

回答

7

我已经解决了这个问题,似乎基于活动和由findFragmentById()是在OnCreate()执行的片段一直没有时间片段两者的生命周期“实际创建',我通过在布局中添加一个简单的按钮并制作一种方法来测试它,当点击按钮时,微调器将被填充数据。

但我当然不希望用户点击“加载”按钮来填充微调框,而是在我的片段上实现了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); 
    } 

}; 
+0

恭喜修复!如果可以,请确保将答案标记为“已接受”,以便其他人可以从您的成功中学习。干杯〜 – 2012-04-02 15:35:04

+0

鉴于如此多的生命周期方法可用于碎片,为各种行动选择正确的时机非常具有挑战性。onActivityCreated似乎也适用于我 – rmirabelle 2012-10-26 03:18:10

0

尝试更改falsetrue在您的充气线。

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

我改变了它,但仍然返回null,我读了该方法的文档,最后一个布尔值表示为:'attachToRoot - 膨胀的层次结构是否应该附加到根参数?如果为false,则root仅用于为XML中的根视图创建LayoutParams的正确子类。“我真的不明白它的含义。 – DanyBoricua 2012-04-01 23:27:41

+0

我猜你的容器是空的,所以片段永远不会被添加。 – 2012-04-02 01:44:22

+0

感谢您的帮助,我能够解决问题。 – DanyBoricua 2012-04-02 03:09:21

2

我有我通过调用

protected void onStart() 
{ 
} 

生命周期方法的findFragmentByTag()解决它同样的问题。