Android进阶之路Android开发经验谈Android技术知识

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

2020-05-08  本文已影响0人  cuixbo

先看这段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标签了!!!

上一篇下一篇

猜你喜欢

热点阅读