- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 this library对于其中一个类(从 ViewGroup 扩展),在 CTOR 内的“PLA_AbsListView.java”中,有这些行:
final TypedArray a = context.obtainStyledAttributes(R.styleable.View);
initializeScrollbars(a);
a.recycle();
最近,我更新了 Android 的 SDK 和 ADT 以支持新的 Android 版本 (Lollipop - API21)。
自从我更新了所有内容后,我不断收到此错误:
The method initializeScrollbars(TypedArray) is undefined for the type PLA_AbsListView
我尝试将要使用的 API 设置为低于 21,但没有帮助。
我也试图找出这个函数的声明位置。它应该是“View.java”中的一个 protected 函数,但由于某种原因,我在the documentations 中看不到它。
怎么可能呢?
我该如何解决?
这可能是文档中的错误吗?
它以前在针对 Kitkat 时有效...
最佳答案
正如@biegleux 在他的回答中提到的,initializeScrollbars()
现在在 API 21 源代码中用 @removed
注释。这是来自 API 21 的方法源:
protected void initializeScrollbars(TypedArray a) {
// It's not safe to use this method from apps. The parameter 'a' must have been obtained
// using the View filter array which is not available to the SDK. As such, internal
// framework usage now uses initializeScrollbarsInternal and we grab a default
// TypedArray with the right filter instead here.
TypedArray arr = mContext.obtainStyledAttributes(com.android.internal.R.styleable.View);
initializeScrollbarsInternal(arr);
// We ignored the method parameter. Recycle the one we actually did use.
arr.recycle();
}
根据方法中的注释,听起来API 21之前的问题是传入TypedArray
不安全,但现在不再使用传入的类型化数组
。所以看起来这应该用 @Deprecated
而不是 @removed
注释,并且应该有这个方法的新版本,它不带参数,可以在我们需要时调用从以编程方式创建的自定义 View 初始化滚动条。
在此问题得到解决之前,您可以通过两种方式解决此问题:
1) 使用 android:scrollbars
属性集从 xml 扩展您的自定义 View 。这是最安全的方法,应该适用于所有过去和 future 的平台版本。例如:
创建一个 xml 布局文件(my_custom_view.xml
):
<com.example.MyCustomView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="horizontal|vertical"/>
膨胀你的自定义 View :
MyCustomView view = (MyCustomView) LayoutInflater.from(context).inflate(R.layout.my_custom_view, container, false);
2) 使用反射在自定义 View 的构造函数中调用 initializeScrollbars()
。如果方法 initializeScrollbars()
实际上被删除或重命名,这在未来的 API 版本中可能会失败。例如:
在您的自定义 View 中(例如 MyCustomView.java
):
public MyCustomView(Context context) {
super(context);
// Need to manually call initializedScrollbars() if instantiating view programmatically
final TypedArray a = context.getTheme().obtainStyledAttributes(new int[0]);
try {
// initializeScrollbars(TypedArray)
Method initializeScrollbars = android.view.View.class.getDeclaredMethod("initializeScrollbars", TypedArray.class);
initializeScrollbars.invoke(this, a);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
a.recycle();
}
关于android - initializeScrollbars 未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448771/
背景 我正在使用 this library对于其中一个类(从 ViewGroup 扩展),在 CTOR 内的“PLA_AbsListView.java”中,有这些行: final TypedA
我是一名优秀的程序员,十分优秀!