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