我为Android 创建了一个自定义视图,它呈现了两个内部视图,用于存储键和两列中的值。该课程如下:
public class KeyValueRow extends RelativeLayout {
protected TextView mLabelTextView;
protected TextView mValueTextView;
public KeyValueRow(final Context context) {
super(context);
init(context, null, 0);
}
public KeyValueRow(final Context context, final AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public KeyValueRow(final Context context,
final AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
protected void init(final Context context,
final AttributeSet attrs, int defStyle) {
View layout = ((LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
.inflate(R.layout.key_value_row, this, true); // line 46
mLabelTextView = (TextView) layout.findViewById(
R.id.key_value_row_label);
mValueTextView = (TextView) layout.findViewById(
R.id.key_value_row_value);
}
public void setLabelText(final String text) {
mLabelTextView.setText(text);
}
public void setValueText(final String text) {
mValueTextView.setText(text);
}
}
关联的布局文件 layout / key_value_row.xml 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<TextView
android:id="@+id/key_value_row_label"
style="@style/KeyValueLabel"
android:layout_weight=".55"
tools:text="Label"/>
<TextView
android:id="@+id/key_value_row_value"
style="@style/KeyValueValue"
android:layout_weight=".45"
tools:text="Value"/>
</LinearLayout>
这可以在布局中使用如下:
<com.example.myapp.customview.KeyValueRow
android:id="@+id/foobar"
style="@style/KeyValueRow" />
直到这里一切正常!
现在,我想允许内部layout_weight
的{{1}} 属性的自定义设置。因此,我在 values / attrs.xml 中准备了属性:
TextView
第一个问题是:浮动 <?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="KeyValueRow">
<attr name="label_layout_weight" format="float" />
<attr name="value_layout_weight" format="float" />
</declare-styleable>
</resources>
的正确格式?
接下来,我将它们应用于布局文件中:
layout_weight
然后可以在示例中使用它们:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<TextView
android:id="@+id/key_value_row_label"
style="@style/KeyValueLabel"
android:layout_weight="?label_layout_weight"
tools:text="Label"/>
<TextView
android:id="@+id/key_value_row_value"
style="@style/KeyValueValue"
android:layout_weight="?value_layout_weight"
tools:text="Value"/>
</LinearLayout>
当我运行此实现时,抛出以下异常:
<com.example.myapp.customview.KeyValueRow
android:id="@+id/foobar"
style="@style/KeyValueRow"
custom:label_layout_weight=".25"
custom:value_layout_weight=".75" />
答案 0 :(得分:1)
您可以使用
private void applyAttributes(Context context, AttributeSet attrs) {
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.KeyValueRow, 0, 0);
try {
labelWeight = a.getFloat(
R.styleable.KeyValueRow_label_layout_weight, 0.55f);
valueWeight = a.getFloat(
R.styleable.KeyValueRow_value_layout_weight, 0.45f);
} finally {
a.recycle();
}
}
之后您可以通过以下方式申请:
mLabelTextView = (TextView) layout.findViewById(R.id.key_value_row_label);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, labelWeight);
mLabelTextView.setLayoutParams(layoutParams);
要让它运行,请将android:layout_weight="?label_layout_weight"
替换为android:layout_weight="0.5"
中的layout/key_value_row.xml
等默认值。它将被覆盖。