【问题标题】:Reading Android attributes on my custom view在我的自定义视图上读取 Android 属性
【发布时间】:2015-10-16 13:53:16
【问题描述】:

我创建了一个自定义布局类(扩展了 RelativeLayout),并将 TextView 作为布局的一部分。

我想将 XML 中声明的属性应用到我的 TextView,无论如何我可以读取 android 属性(不是我的自定义属性,那部分已经处理好了)。

例如,在我的 XML 中,我会有这个:

<my.custom.MyLayout
    android:layout_width="100dp"
    android:layout_height="20dp"
    android:text="SomeText" /> 

我想读取 text 属性并将其应用于我的 TextView(目前它正在应用于 RelativeLayout),而不是创建我自己的属性并读取它。

我的自定义布局是这样的:

public class MyLayout extends RelativeLayout {

    private TextView textView;
    public void MyLayout(final Context context, final AttributeSet attrs) {
        /**Read android attributes and apply it to TextView **/
        ??
    }

我当前的解决方案是创建自定义属性并读取它们,但我觉得这不是一个好的解决方案,因为我将复制每个声明为 TextView 的属性。

有关我当前解决方案的更多信息。

我有一个名为 myText 的自定义属性,用于将 XML 中声明的文本应用到我的 TextView。

在我的布局 XML 中:

myNameSpace:myText="SomeText"

并在我的 Java 类中阅读它:

String text= a.getString(R.styleable.MyStyleable_myText);
textView.setText(text);

我希望摆脱我的自定义属性并阅读“android:”属性。

【问题讨论】:

  • 如果 MyLayout 是您的自定义组件,那么您可以编写 getter 来获取任何属性或任何内容
  • 我想读取 XML 属性,例如 android:text="SomeText" 作为传递给每个视图的构造函数的 attrs 值的一部分。我不能为此使用吸气剂。

标签: android android-layout android-custom-view


【解决方案1】:

首先我不确定设置android:text 是否可以扩展RelativeLayout 的视图。如果可能的话,可以像TextView 实现那样做:

final Resources.Theme theme = context.getTheme();
a = theme.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
text = a.getText(attr);

所以基本上它与您获取自定义属性的方式相同,但样式不同。

如果它不起作用,我会考虑另一种方法。我这样做是为了我的一个自定义视图。由于您的自定义视图中有 TextView,您可以在 XML 中创建它,然后在自定义视图中获取对该子项的引用。

<YourCustomView>
    <TextView android:text="someText"/>
<YourCustomView/>

【讨论】:

  • 啊,谢谢,我一直在寻找可样式化的东西。文本只是一个例子,我想复制宽度和高度等其他属性。
  • 什么是attr
  • @Eido95 这是一个属性索引。我从 TextView 源代码中复制了它,所以最好看看那里。您可以从 IDE 或这里查看 grepcode.com/file/repository.grepcode.com/java/ext/…
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多