【问题标题】:Finding Fragment View on Activity. Android findFragmentByTag(String tag) returns null在活动中查找片段视图。 Android findFragmentByTag(String tag) 返回 null
【发布时间】:2012-04-01 18:15:25
【问题描述】:

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

我有一个 Activity,它在它的 LinearLayout 上添加了一个 Fragment,片段的布局基于来自 Activity 意图的“额外”。一切都正确显示,我可以看到片段的所有视图,但由于某种原因,当我调用 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() 返回空

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

【问题讨论】:

  • 我知道这篇文章已经过时了,但是如果你把 Fragment 放在它自己的类中,事情会容易得多。

标签: android view android-activity spinner fragment


【解决方案1】:

我已经解决了这个问题,似乎基于活动和片段的生命周期,在 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);
    }

 };

【讨论】:

  • 恭喜修复!如果有能力,请确保将您的答案标记为“已接受”,以便其他人可以从您的成功中学习。干杯~
  • 鉴于片段可用的生命周期方法如此之多,为各种操作选择正确的时机非常具有挑战性。 onActivityCreated 似乎也对我有用
【解决方案2】:

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

中调用 findFragmentByTag() 解决了它
protected void onStart()
{
}

生命周期法。

【讨论】:

    【解决方案3】:

    尝试在您的 inflate 行中将 false 更改为 true

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

    【讨论】:

    • 我更改了它,但仍然返回 null,我阅读了该方法的文档,最后一个布尔值是:attachToRoot - Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML. 我真的不明白这是什么意思。
    • 我猜你的容器是空的,所以片段永远不会被添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2017-12-22
    • 2018-07-14
    相关资源
    最近更新 更多