gpt4 book ai didi

android - initializeScrollbars 未定义?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:35 25 4
gpt4 key购买 nike

背景

我正在使用 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/

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