在Android应用我目前正在开发具有增长相当大的一个主要活动。这主要是因为它含有3个选项卡的TabWidget。每个标签都有相当多的部件。该活动有一次来控制所有这些组件。所以我觉得你可以想像,这一活动已经像20场(几乎每一个组件中的字段)。此外,它含有大量的逻辑的(点击听众,逻辑填补列表等)。

我通常在基于组件的架构做的是所有东西分裂成自定义组件。然后,每个自定义组件将有明确的责任。这将包含它自己的组件集合和所有其他逻辑相关的该组件。

我试图找出如何可以做到这一点,而且我发现Android文档他们喜欢称之为“复合控制”的东西。 (请参见 http://developer.android.com/guide/topics /ui/custom-components.html#compound 并滚动到“化合物控制”部分)我想基于定义的视图结构的XML文件来创建这样的组件。

在文档它说:

  

请注意,正如与一个活动,   您可以使用声明   (基于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);
    }
}

这个工作,除了为我加载XML已经LinearLayout声明为根元素的事实。这导致在充气LinearLayoutMyCompoundComponent的孩子本身已经是一个LinearLayout!所以,现在我们有一个多余的LinearLayout在MyCompoundComponent和实际需要之间的意见。

有人可以请给我提供一个更好的方式来处理这个,避免有多余LinearLayout实例?

有帮助吗?

解决方案

使用合并代码为您的XML根点击

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Your Layout -->
</merge>

检查本文。

其他提示

我觉得你应该做的方式,就是用你的类名作为XML根元素:

<com.example.views.MyView xmlns:....
       android:orientation="vertical" etc.>
    <TextView android:id="@+id/text" ... />
</com.example.views.MyView>

再有你的类从您要使用的任何布局的。请注意,如果您正在使用这个方法,你的的这里使用的布局吹气。

public class MyView extends LinearLayout
{
    public ConversationListItem(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }
    public ConversationListItem(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }


    public void setData(String text)
    {
        mTextView.setText(text);
    }

    private TextView mTextView;

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();

        mTextView = (TextView)findViewById(R.id.text);
    }
}

然后就可以使用XML布局为正常视图。如果你想使视图程序你必须自己夸大它:

MyView v = (MyView)inflater.inflate(R.layout.my_view, parent, false);

不幸的是,这并不让你做v = new MyView(context),因为似乎没有被周围的嵌套布局问题的一种方式,所以这是不是一个真正的完整的解决方案。你可以添加一个方法,像这样MyView使它更好一点:

public static MyView create(Context context)
{
    return (MyView)LayoutInflater.fromContext(context).inflate(R.layout.my_view, null, false);
}

声明:我可以说完全胡说八道

scroll top