不使用额外的视图层次结构创建自定义视图

5

通常情况下,我会创建一个自定义视图,例如:

public class MyView extends LinearLayout{

  public MyView(Context context){
     super(context);

     //Inflating my custom layout
     LayoutInflater inflater = getLayoutInflater();
     inflater.inflate(R.layout.view_layout, this); 

  }

}

上述布局的问题是,它会创建一个新的 LinearLayout 并在其中填充 R.layout.view_layout,从而添加一个不必要的视图层级。

R.layout.view_layout 包含多个子元素的 RelativeLayout,如果通过继承 RelativeLayout 进行编程添加很困难。

不必要的层次结构会拖慢应用程序的运行速度。

最佳的创建 自定义视图/视图组 的方法是什么,不需要额外的层次结构?

根据 CommonsWare 的解决方案已解决:

XML 布局:

<merge>

<TextView ...
.../>

More items

</merge>

由于XML布局的父视图是RelativeLayout,因此我将在代码中扩展RelativeLayout,而不是LinearLayout

public class MyView extends RelativeLayout{

      public MyView(Context context){
         super(context);

         //Inflating my custom layout
         LayoutInflater inflater = getLayoutInflater();
         inflater.inflate(R.layout.view_layout, this); 

      }

    }
2个回答

4

res/layout/view_layout.xml 的起始元素改为 <merge> 标签,而非 LinearLayout 标签,以优化布局。


3
虽然他在xml中使用了一个merge标签,但我并不完全理解这一点,他仍然需要在xml中使用一个RelativeLayout来保持子视图的位置,是吗?因此,如果他从RelativeLayout继承并在merge标签内使用一个RelativeLayout来保持位置,那么是否会形成重复的层次结构? - 4gus71n
1
@astinx:抱歉,是的,我应该更清楚地表达。自定义的“View”应该扩展根容器所需的任何内容,然后XML的根元素可以是<merge>,以避免重复容器。 - CommonsWare
是的,我确实在xml布局中使用了merge,并在代码中扩展了一个viewgroup。但是仍然没有看到很大的改进。 - dcanh121

0

<merge>是解决方案,但在IDE的设计模式下你的布局会显示不正确,这可能会很麻烦。为了解决此问题,您需要:

<merge
    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
    tools:layout_width="match_parent"
    tools:layout_height="match_parent">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接