美文网首页Android进阶之路Android开发经验谈Android技术知识
Fragment的根布局可不可以使用merge标签?

Fragment的根布局可不可以使用merge标签?

作者: cuixbo | 来源:发表于2020-05-08 19:45 被阅读0次

    先看这段xml,它可以作为我们Fragment的根布局吗?

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android">
        <TextView
            android:id="@+id/tv_text"
            android:layout_width="200dp"
            android:layout_gravity="right"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="This is a merge fragment!" />
    </merge>
    

    我们再来看一下LayoutInflater的源码:

     public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
            synchronized (mConstructorArgs) {
                Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate");
                final Context inflaterContext = mContext;
                final AttributeSet attrs = Xml.asAttributeSet(parser);
                Context lastContext = (Context) mConstructorArgs[0];
                mConstructorArgs[0] = inflaterContext;
                View result = root;
                try {
                    advanceToRootNode(parser);
                    final String name = parser.getName();
                    ...
                    if (TAG_MERGE.equals(name)) {
                        // 关键看这段代码
                        if (root == null || !attachToRoot) {
                            throw new InflateException("<merge /> can be used only with a valid "
                                    + "ViewGroup root and attachToRoot=true");
                        }
                        rInflate(parser, root, inflaterContext, attrs, false);
                    } else {
                        ...
                    }
                } catch (Exception e) {
                   ...
                } finally {
                   ...
                }
                return result;
            }
        }
    

    只看关键代码,发现其实应该是可以的,只需要root!=null && attachToRoot==true就可以了。
    下面具体看看Fragment如何去实现:

    /**
     * @author xiaobocui
     * @date 2020/5/8
     */
    class TestFragment : Fragment() {
        companion object {
            fun newInstance(): TestFragment {
                return TestFragment()
            }
        }
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            inflater.inflate(R.layout.fragment_test, container, true)
            return super.onCreateView(inflater, container, savedInstanceState)
            // 或者 return null 也行
        }
    }
    

    这里有个注意事项,如果根标签是merge那么onCreateView方法的返回值就不能再返回view了,否则会添加多次,而抛出异常。
    其实在inflater.inflate(R.layout.fragment_test, container, true)这段代码中就已经将merge的标签的布局添加到container里面去了。
    大功告成,这样操作,Fragment的根布局就可以使用merge标签了!!!

    相关文章

      网友评论

        本文标题:Fragment的根布局可不可以使用merge标签?

        本文链接:https://www.haomeiwen.com/subject/tfyqnhtx.html