无法检索属性

时间:2013-10-24 11:02:56

标签: android android-layout android-viewpager

更新 - 请在最后看到一个决议,我现在需要的只是一个解释。 尽管搜索我找不到相同的问题

我创建了一个自定义Viewpager并在attrs.xml中定义了一个自定义属性

在我尝试检索属性的视图寻呼机构造函数中,我无法获得有意义的值。我尝试使用

abstract int     getAttributeIntValue(String namespace, String attribute, int defaultValue)

返回'attribute'的整数值。

public MyViewPager(Context context, AttributeSet attrs) {
    Log.d(Constant.TAG, "ViewPagerType:" + attrs.getAttributeUnsignedIntValue("http://schemas.android.com/apk/res-auto","view_pager_type",9));
    Log.d(Constant.TAG, "ViewPagerType:" + attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","view_pager_type",9));
    Log.d(Constant.TAG, "ViewPagerType:" + attrs.getAttributeValue("http://schemas.android.com/apk/res-auto","view_pager_type"));
    Log.d(Constant.TAG, "ViewPagerType:" + attrs.getAttributeValue("http://schemas.android.com/apk/res-auto","garbage"));

正如你所看到的,attrs.getAttributeValue做了一个字符串,但它对我没有意义。

这是日志语句的输出 - 如果没有找到9是默认值,我不承诺@ 213号码是什么

ViewPagerType:9          
ViewPagerType:9          
ViewPagerType:@2131230723
ViewPagerType:null       

这是我的attrs.xml

<resources>
    <declare-styleable name="AutoResizeTextView">
        <attr name="ttf_name" format="string"/>
    </declare-styleable>
    <declare-styleable name="ViewPagerType">
       <attr name="view_pager_type" format="integer"/>
   </declare-styleable>
</resources>

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">


<org.rh.ellierides.MyViewPager xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/textPager"
    app:view_pager_type="@integer/text_viewpager"
    android:orientation="horizontal"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="24"
    tools:context=".Main">

这是integer.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="text_viewpager">1</integer>
    <integer name="image_viewpager">2</integer>
</resources>

我想我会创建两个单独的浏览器,但我仍然希望了解这一点。


更新我找到了一个解决方案,但不明白为什么第一个没有用,所以请仍然回答

    TypedArray a = null;
    try {
        a = getContext().obtainStyledAttributes(attrs, R.styleable.ViewPagerType);
        int viewpagerType = a.getInt(R.styleable.ViewPagerType_view_pager_type, 9);
        Log.d(Constant.TAG, "viewpagerType:" + viewpagerType);
    } finally {
        if (a != null) {
            a.recycle(); // ensure this is always called
        }
    }

1 个答案:

答案 0 :(得分:0)

以下作品,但正如我上面所说,请向我解释。传递给构造函数的attrs是什么?

    TypedArray a = null;
    try {
        a = getContext().obtainStyledAttributes(attrs, R.styleable.ViewPagerType);
        int viewpagerType = a.getInt(R.styleable.ViewPagerType_view_pager_type, 9);
        Log.d(Constant.TAG, "viewpagerType:" + viewpagerType);
    } finally {
        if (a != null) {
            a.recycle(); // ensure this is always called
        }
    }