鉴于我想要一个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 - 但是当我在这个布局中需要一个状态时,我看不到好的方法。任何提示和最佳实践欢迎!
答案 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/