搜索模式以删除视图组子类不需要的布局

时间:2014-05-19 21:44:59

标签: android android-layout

鉴于我想要一个LinearLayout的子类化,如下所示:

public class MyLayout extends LinearLayout {

    public int someState=0;

    public ListViewHeadView(Context context) {
        super(context);
        View.inflate(context, R.layout.some_layout, this);
    }

    // more code here
}

像some_layout这样:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
                style="@style/textStyle"
                android:id="@+id/someTextView"/>

        <Button
                style="@style/buttonStyle"
                android:id="@+id/someButton"/>
    </LinearLayout>

这样可以正常工作,但我有一个LinearLayout很多,这会花费性能。我现在看到删除不需要的LinearLayout的唯一方法是在xml中使用<merge>而不是LinearLayout。但是我必须在我的代码中执行setOrientation,我希望在xml中看到它(一次 - 不是所有用法)。 有人能指出我如何很好地做到这一点的模式?如果我没有状态,我可以使用装饰器模式,只需用我需要的函数装饰LinearLayout - 但是当我在这个布局中需要一个状态时,我看不到好的方法。任何提示和最佳实践欢迎!

3 个答案:

答案 0 :(得分:1)

我在您的自定义android:orientation的项目attrs.xml中定义了ViewGroup属性,并添加了一些代码以在ViewGroup构造函数中对此进行评估。

答案 1 :(得分:0)

这是<merge>元素的一种用法。将其作为XML文件中的根代替<LinearLayout>

每当您使用<com.example.MyView ... android:orientation="....">使用自定义视图时,都可以设置方向 或者使用setOrientation

的代码

如果此海关视图的方向始终相同,您可以覆盖设置方向而不是调用超级或类似的东西

答案 2 :(得分:-1)

定义样式属性并通过样式提供方向

attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyLayout">
        <attr name="myLayoutStyle" format="reference"/>
    </declare-styleable>
</resources>

style.xml

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:windowBackground">@color/main_background</item>
        <item name="myLayoutStyle">@style/MyLayoutStyle</item>
    </style>

    <style name="MyLayoutStyle" parent="android:Widget.Holo.Light">
        <item name="android:orientation">vertical</item>
    </style>

</resources>

然后在你的构造函数中:

public class MyLayout extends LinearLayout {

    public int someState=0;

    public ListViewHeadView(Context context) {
         super(context, null, R.attr.MyLayoutStyle)
        View.inflate(context, R.layout.some_layout, this);
    }

    // more code here
}

在构造函数中,引用是Stylable,而不是样式

解决方案改编自:

http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/