Android片段布局完成膨胀

Posted

技术标签:

【中文标题】Android片段布局完成膨胀【英文标题】:Android fragment layout finished inflating 【发布时间】:2013-05-01 11:06:27 【问题描述】:

我想以编程方式将一些图形添加到布局中。我想根据xml layout file 中其他图形元素的位置动态定位图形。

如果我尝试在onCreateViewonViewCreated 中访问它们,布局中图形的位置都是0。这可能是因为布局还没有完成膨胀。

我可以在哪里连接我的代码以确保片段的布局已完成膨胀?

目前我已经使用viewTreeObserver解决了这个问题(见下面的代码),但这真的是最聪明的方法吗?

我正在片段中工作。

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)      
        View v = inflater.inflate(R.layout.myfrg, container, false);
        mMainLayoutCanvas = (RelativeLayout)v.findViewById(R.id.myfrg_mainlayout);
        mMainLayoutCanvas.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
            @Override
            public void onGlobalLayout() 
                initializeUI();
            
        );
        return v;
    

【问题讨论】:

你的做法是正确的做法,因为像@RubenWeerts 所说的等待 onActivityCreated() 需要更多时间。 @Daniel 需要更多时间吗? @MaciejGórski 我认为他的意思是这是正确的地方,因为 onCreateView 旨在绘制片段的用户界面。 onActivityCreated 应该处理检索状态等而不是布局(用户界面)。这需要更多时间,因为在 onActivityCreated 之前调用了 onCreateView。参考链接:developer.android.com/guide/components/fragments.html 【参考方案1】:

onCreateView 膨胀Fragment 的布局。您只能在 onCreateView 返回后找到视图。 我会使用onActivityCreated() 方法来查找视图,然后更新/定位它们。

可能有一个完全不同的解决方案,我刚开始使用 Android

【讨论】:

【参考方案2】:

可以在膨胀的片段布局上设置 preDraw 侦听器,这将在所有维度都已解析后为您提供回调。

layout = inflater.inflate(...);
ViewTreeObserver obs = layout.getViewTreeObserver();
obs.addOnPreDrawListener(mListener);

完成操作后不要忘记删除监听器,否则会导致无限循环,因为任何布局操作都会导致再次调用它。

obs.removePreDrawListener(mListener);

【讨论】:

以上是关于Android片段布局完成膨胀的主要内容,如果未能解决你的问题,请参考以下文章

使用兼容包 android 膨胀片段

Android:在drawerlayout中使用地图膨胀片段时出错

android.view.InflateException:二进制 XML 文件:膨胀类片段时出错

膨胀类 com.google.android.material.slider.Slider 时出错

使用 Android 膨胀类片段时出错

在首选项设置中膨胀布局