Android - 编写自定义(复合)组件

Tom*_*ren 131 java android custom-component

我正在开发的Android应用程序的主要活动已经变得非常大.这主要是因为它包含TabWidget3个选项卡.每个选项卡都有很多组件.活动必须立即控制所有这些组件.所以我认为你可以想象这个Activity有20个字段(几乎每个组件都有一个字段).它还包含许多逻辑(单击侦听器,填充列表的逻辑等).

我通常在基于组件的框架中做的是将所有内容拆分为自定义组件.然后,每个自定义组件都有明确的责任.它将包含它自己的一组组件以及与该组件相关的所有其他逻辑.

我试图弄清楚如何做到这一点,我在Android文档中发现了他们喜欢称之为"复合控制"的东西.(请参阅http://developer.android.com/guide/topics/ui/custom-components.html#compound并滚动到"复合控件"部分)我想基于XML文件创建这样一个组件来定义查看结构.

在文档中它说:

请注意,就像使用Activity一样,您可以使用声明式(基于XML)方法来创建包含的组件,也可以从代码中以编程方式嵌套它们.

嗯,这是个好消息!基于XML的方法正是我想要的!但它没有说明如何做到这一点,除了它"像一个活动"...但我在一个活动中做的是调用setContentView(...)从XML膨胀视图.如果您是子类,那么该方法不可用LinearLayout.

所以我尝试像这样手动扩充XML:

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了我正在加载的XML已LinearLayout声明为根元素的事实.这导致被夸大LinearLayout的孩子MyCompoundComponent本身已经是一个LinearLayout!! 所以现在我们之间有一个冗余的LinearLayout MyCompoundComponent和它实际需要的视图.

有人可以请给我一个更好的方法来解决这个问题,避免LinearLayout实例化冗余吗?

bha*_*982 100

使用merge标记作为XML根目录

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Your Layout -->
</merge>
Run Code Online (Sandbox Code Playgroud)

看看这篇文章.

  • 非常感谢你!这正是我想要的.令人惊讶的是,如此长的问题可以得到如此简短的答案.优秀! (10认同)
  • @Timmmm haha​​haha我在视觉编辑器存在之前很久就问了这个问题:) (2认同)