如何从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正是我期望的价值。

  • 无法解析资源@style / Widget.Holo.Light.ActionMode.Inverse
  • Android:如何在特定区域设置中获取字符串而不更改当前区域设置
  • 代码中的Android ImageView setImageResource
  • 从Assets文件夹设置Notification Sound
  • 控制来自资源的视图可见性
  • Android Studio:创建横向布局
  • 构build应用程序时出现“找不到资源”错误
  • R.java中的奇怪错误,即使在清理项目之后:“下划线只能用于1.7级或更高级别的源代码”
  • 有几件事要说:

    • 首先,您需要在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(); } } // ... }