我正在尝试检索我为片段定义的自定义属性的值。我的问题是,当TypedArray.getInteger()访问时,自定义属性的返回值始终为0而不是布局文件中设置的值 - 但仅限于运行5.0的设备。
引用一些我发现有助于解决我的问题的资源:Google's FragmentArgument演示用于获取自定义样式属性,this stackoverflow post已在其他一些有关获取的stackoverflow问题上引用Android片段的自定义属性和this article。
使用这些资源,我已成功为运行api 16-19的设备上的片段设置了自定义属性,但在运行Android L的设备上没有。
代码段:
RES /值/ attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ComposerFragment">
<attr name="position" format="enum">
<enum name="left" value="1"/>
<enum name="right" value="2"/>
</attr>
</declare-styleable>
</resources>
composer_activity.xml (布局文件)
<?xml version="1.0" encoding="utf-8"?>
<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"
>
<!-- other views elided -->
<fragment
android:name="com.mypackage.name.ui.fragment.ComposerFragment"
android:id="@+id/left_composer"
<!-- layout attributes elided -->
app:position="left">
<requestFocus/>
</fragment>
<fragment
android:name="com.mypackage.name.ui.fragment.ComposerFragment"
android:id="@+id/right_composer"
<!-- layout attributes elided -->
app:position="right"
/>
</RelativeLayout>
ComposerFragment.java (扩展支持片段)
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
TypedArray a = activity.obtainStyledAttributes(attrs, R.styleable.ComposerFragment);
mBackgroundScrollerPosition =
a.getInteger(R.styleable.ComposerFragment_position, Position.NOT_SPECIFIED); // Position.NOT_SPECIFIED == 0
a.recycle();
}
我在attrs.xml中尝试了<attr name="position" format="integer">
,只在布局xml中设置app:position="1"
,但a.getInteger(R.styleable.ComposerFragment_position, Position.NOT_SPECIFIED);
中返回的值始终为0 - 在运行5.0的设备上。
如前所述,我的方法适用于运行JellyBean和KitKat的设备。