gpt4 book ai didi

android - 将 XML 文件设置为自定义 View ?

转载 作者:行者123 更新时间:2023-11-30 03:18:53 27 4
gpt4 key购买 nike

我正在制作一个自定义表格行。我想使用 XML 文件来定义单行的外观。我想让一个类扩展 TableRow 并将其自身定义为 XML 中定义的文件。 XML 文件可能如下所示:

<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:text="@string/loading"
android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
android:id="@+id/data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:text="@string/loading"
android:textAppearance="?android:attr/textAppearanceLarge" />

</TableRow>

代码可能是这样的:

public class SpecialTableRow extends TableRow {

public SpecialTableRow (Context context) {
}
}

是否可以将某些东西放入构造函数中,让类假设它是整个 tableRow?或者,是否有另一种结构会更好?我想到的最好的是:

    TableRow tr=(TableRow) LayoutInflater.from(context).inflate(R.layout.text_pair,null);
TextView mFieldName=(TextView) tr.findViewById(R.id.label);
TextView mValue=(TextView) tr.findViewById(R.id.data);
tr.removeAllViewsInLayout();
addView(mFieldName);
addView(mValue);

但这会从 XML 中删除布局参数。还有更好的吗?

最佳答案

查看creating custom views上的教程.您将希望子类化 TableRow 并添加要显示的其他 View 。然后,您可以直接在您的 XML 布局中使用您的新 View ,并另外创建您可能需要的任何自定义属性。我提供了一个示例,它创建一个名为 TextPairRow 的自定义 TableRow,用两个 TextView 扩展布局以在 TableRow 中显示,并添加显示/隐藏两个 TextView 的 showLabel 和 showData 自定义属性。最后,我介绍了如何在 XML 布局中直接使用新 View 。

class TextPairRow extends TableRow {

private TextView label, data;

public TextPairRow (Context context, AttributeSet attrs) {
super(context, attrs);

TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.TextPairRow, 0, 0);

try {
showLabel = a.getBoolean(R.styleable.TextPairRow_showLabel, false);
showData = a.getBoolean(R.styleable.TextPairRow_showData, false);
} finally {
a.recycle();
}

initViews();
}

private void initViews(){

// Here you can inflate whatever you want to be in your
// view or add views programatically.
// In this example, we'll just assume you have a basic XML
// layout which defines a LinearLayout with two TextViews.
LinearLayout mLayout = (LinearLayout)
LayoutInflater.from(getContext()).inflate(R.layout.textview_layout, this);

label = (TextView) mLayout.findViewById(R.id.label);
data = (TextView) mLayout.findViewById(R.id.data);

if(showLabel)
label.setVisibility(View.VISIBLE);
else
label.setVisibility(View.GONE); // can also use View.INVISIBLE
// depending on your needs

if(showData){
data.setVisibility(View.VISIBLE);
else
data.setVisibility(View.GONE); // can also use View.INVISIBLE
// depending on your needs
}
}

这是您定义自定义 XML 属性的地方(找到或创建此文件:res/values/attrs.xml)

<resources>
<declare-styleable name="TextPairRow">
<attr name="showText" format="boolean" />
<attr name="showLabel" format="boolean" />
</declare-styleable>
</resources>

最后,直接在 XML 布局中使用新 View :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto">
<com.thefull.packageforyourview.TextPairRow
android:orientation="horizontal"
custom:showData="true"
custom:showLabel="true" />
</LinearLayout>

请注意,您可能需要使用 xmlns:custom="http://schemas.android.com/apk/res/com.thefull.packageforyourview" 取决于您的自定义 View 是否在图书馆项目中。无论如何,这个或示例中的内容都可以工作。

关于android - 将 XML 文件设置为自定义 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19528473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com