gpt4 book ai didi

android - 使用 obtainStyledAttributes 方法的魔法

转载 作者:行者123 更新时间:2023-11-30 02:48:12 25 4
gpt4 key购买 nike

代码:

public class CustomLayoutWithText extends LinearLayout {

private Context context;
private AttributeSet attrs;

public CustomLayoutWithText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
this.attrs = attrs;
fooAttrs();
}

@Override
protected void onFinishInflate() {
super.onFinishInflate();
fooAttrs();
}

private void fooAttrs() {
int[] set = {
android.R.attr.text // idx 0
};
TypedArray a = context.obtainStyledAttributes(attrs, set);
Log.d(null, a.getString(0));
}
}

和 XML:

<com.korovyansk.android.views.CustomLayoutWithText
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Some text"/>

合理预期输出将是:
一些文字
一些文字

但它是:
一些文字

为什么第二次显示为空?以及如何避免?

最佳答案

我认为 attrs 中的所有数据都会被回收。事实上,在所有示例中,他们都建议在 View 的构造函数中显式回收所有从 AttributeSet 获得的类型化数组。我认为您也应该遵循最佳实践。

    TypedArray a = context.obtainStyledAttributes(attrs, set);
try {
// read attributes from a
// ...
} finally {
attributes.recycle();
}

我的猜测是当 onFinishInflate() 被调用时,attrs 已经是空的或不可用了。

其实根据LayoutInflater的代码,布局膨胀时传入View构造函数的AttributeSet其实是基于XmlPullParser . onFinishInflate() 在其所有 subview 充气后在父 View 上调用。

看起来在 'onFinishInflate()' 中此时您无法从 attrs 中获取您的属性值。特别是如果您的布局中有 child - attrs 将引用相同的解析器,但解析器的位置将指向最后解析的 child 的属性。

关于android - 使用 obtainStyledAttributes 方法的魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com