如何从java代码读取自定义维度属性

我做了我的自定义组件只是把几个TextViews在一起。 现在我想直接从代码初始化我的自定义控件,为每个电视独立传递文本大小

我的属性定义:

<resources> <declare-styleable name="BasicGauge"> <attr name="valueTextSize" format="dimension" /> <attr name="titleTextSize" format="dimension" /> <attr name="unitsTextSize" format="dimension" /> </declare-styleable> </resources> 

组件的示例初始化:

 <pl.com.digita.BikeComputerUi.customviews.BasicGauge android:id="@+id/basicGauge1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="10dp" valueTextSize="40sp"> </pl.com.digita.BikeComputerUi.customviews.BasicGauge> 

我如何尝试读取组件的构造函数中的属性:

 final int N = typedArray.getIndexCount(); for (int i = 0; i < N; i++) { int attribute = typedArray.getIndex(i); switch (attribute) { case R.styleable.BasicGauge_valueTextSize: valueTextSize = typedArray.getString(attribute); break; case R.styleable.BasicGauge_titleTextSize: titleTextSize = typedArray.getString(attribute); break; case R.styleable.BasicGauge_unitsTextSize: unitsTextSize = typedArray.getString(attribute); break; } typedArray.recycle(); } 

问题:创build之后,所有的值都是空的。 40sp正是我期望的价值。

Solutions Collecting From Web of "如何从java代码读取自定义维度属性"

有几件事要说:

  • 首先,您需要在xml顶部有一个xml名称空间声明行,与您使用android xmlns完全相同:xmlns:foo =“http://schemas.android.com/apk/res-auto&#x201D;
  • 那么你需要用你的xmlns前缀valueTextSize:foo:valueTextSize =“40sp”

之后,得到一个string并不是一个好主意,android提供了更强大的解决scheme来处理维度:

 int unitsTextSize = typedArray.getDimensionPixelSize(R.styleable.BasicGauge_unitsTextSize, textSize); 

那么有一些缺点:

  • 对于绘画或textpaint,您可以将此值设置为: paint.setTextSize(unitTextSize):
  • 对于textview,上述方法将失败,并且您必须使用setText的重载才能获得正确的结果: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, unitTextSize);

不同之处在于所谓的“原始像素”(根据密度,未加标度)和“缩放像素”(相反)。

对于接受的答案稍微多一些:

attrs.xml

使用dimension格式设置自定义属性。

 <resources> <declare-styleable name="CustomView"> <attr name="valueTextSize" format="dimension" /> <attr name="titleTextSize" format="dimension" /> <attr name="unitsTextSize" format="dimension" /> </declare-styleable> </resources> 

activity.xml

使用xmlns:app=...引用您的属性,并将它们设置在您的xml中app:...

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.myproject.CustomView android:layout_width="wrap_content" android:layout_height="wrap_content" app:valueTextSize="40sp" app:titleTextSize="20sp" app:unitsTextSize="24sp" /> </RelativeLayout> 

CustomView.java

使用getDimensionPixelSize从TypedArray获取值。 在您的自定义视图中只需使用像素。 如果您需要转换为其他维度,请参阅此答案 。

 public class CustomView extends View { private float mValueTextSize; // pixels private float mTitleTextSize; // pixels private float mUnitsTextSize; // pixels public CustomView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.CustomView, 0, 0); try { mValueTextSize = a.getDimensionPixelSize(R.styleable.CustomView_valueTextSize, 0); mTitleTextSize = a.getDimensionPixelSize(R.styleable.CustomView_titleTextSize, 0); mUnitsTextSize = a.getDimensionPixelSize(R.styleable.CustomView_unitsTextSize, 0); } finally { a.recycle(); } } // ... }