- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 Android 1.6 上使用带有列表状态 Drawable 的 mutate 时,我总是遇到空指针异常。它在更高的 Android 版本上完美运行。我正在使用默认的 android list_selector_background 作为要改变的 drawable,我需要改变它,否则按下的背景会变得非常困惑 -> 当按下一个时,全部或部分背景会突出显示。
项目在这里:
http://code.google.com/p/tree-view-list-android/
return activity.getResources()
.getDrawable(android.R.drawable.list_selector_background)
.mutate();
下面的堆栈跟踪:
3-11 11:37:39.973: ERROR/AndroidRuntime(5304): java.lang.NullPointerException
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.graphics.drawable.StateListDrawable.mutate(StateListDrawable.java:227)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at pl.polidea.treeview.AbstractTreeViewAdapter.getDrawableOrDefaultBackground(AbstractTreeViewAdapter.java:201)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at pl.polidea.treeview.AbstractTreeViewAdapter.populateTreeItem(AbstractTreeViewAdapter.java:210)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at pl.polidea.treeview.AbstractTreeViewAdapter.getView(AbstractTreeViewAdapter.java:153)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.AbsListView.obtainView(AbsListView.java:1273)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.ListView.makeAndAddView(ListView.java:1658)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.ListView.fillDown(ListView.java:637)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.ListView.fillFromTop(ListView.java:694)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.ListView.layoutChildren(ListView.java:1516)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.AbsListView.onLayout(AbsListView.java:1112)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.View.layout(View.java:6569)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.View.layout(View.java:6569)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.View.layout(View.java:6569)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.View.layout(View.java:6569)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.View.layout(View.java:6569)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.ViewRoot.performTraversals(ViewRoot.java:979)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.os.Handler.dispatchMessage(Handler.java:99)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.os.Looper.loop(Looper.java:123)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at android.app.ActivityThread.main(ActivityThread.java:4203)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at java.lang.reflect.Method.invokeNative(Native Method)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at java.lang.reflect.Method.invoke(Method.java:521)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
03-11 11:37:39.973: ERROR/AndroidRuntime(5304): at dalvik.system.NativeStart.main(Native Method)
最佳答案
Android 1.6 好像有bug。当您深入研究 Android 1.6 源代码时,您会发现以下代码:
android.graphics.drawable.StateListDrawable.java:
...
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
final int[][] sets = mStateListState.mStateSets;
final int count = sets.length;
mStateListState.mStateSets = new int[count][];
for (int i = 0; i < count; i++) {
mStateListState.mStateSets[i] = sets[i].clone(); //NPE causing line
}
mMutated = true;
}
return this;
}
...
排队
mStateListState.mStateSets[i] = sets[i].clone(); //NPE causing line
clone() method is sometimes called on null object and it causes NullPointerException
在 Android > 1.6它已被修复:
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
final int[][] sets = mStateListState.mStateSets;
final int count = sets.length;
mStateListState.mStateSets = new int[count][];
for (int i = 0; i < count; i++) {
final int[] set = sets[i];
if (set != null) {
mStateListState.mStateSets[i] = set.clone();
}
}
mMutated = true;
}
return this;
}
但在 Android 1.6 中我们需要做一些变通。让我们看看为什么 mStateSets[i] 有时包含空值:
android.graphics.drawable.DrawableContainer.DrowableContainerState:
...
public final int addChild(Drawable dr) {
final int pos = mNumChildren;
if (pos >= mDrawables.length) {
growArray(pos, pos+10); //Interesting line
}
dr.setVisible(false, true);
dr.setCallback(mOwner);
mDrawables[pos] = dr;
mNumChildren++;
mChildrenChangingConfigurations |= dr.getChangingConfigurations();
mHaveOpacity = false;
mHaveStateful = false;
mConstantPadding = null;
mPaddingChecked = false;
mComputedConstantSize = false;
return pos;
}
...
上面的方法在从 xml 膨胀对象的过程中被调用。所以mStateListState.mStateSets的大小为N*10。
现在让我们看看您正试图从 android.R.drawable.list_selector_background 引用的资源中膨胀的 list_selector_background.xml 的主体:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false"
android:drawable="@color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/list_selector_background_focus" />
</selector>
此文件仅包含 6 个项目!那么我们如何解决这个问题呢?1. 在{Project}/res/drowable/下创建list_selector_background.xml 你可以复制Android的一个只改一行:
<item android:state_window_focused="false"
android:drawable="@color/transparent" />
到
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
复制 Android 或创建自己的文件:
list_selector_background_disabled.9.pnglist_selector_background_focus.9.pnglist_selector_background_longpress.9.pnglist_selector_background_pressed.9.pnglist_selector_background_transition.xml
修改 list_selector_background.xml 添加虚拟项目以完全匹配(6+4=10)个项目条件:
<item android:animationCache="true"
android:drawable="@android:color/transparent" />
<item android:animationCache="false"
android:drawable="@android:color/transparent" />
<item android:alwaysDrawnWithCache="false"
android:drawable="@android:color/transparent" />
<item android:alwaysDrawnWithCache="true"
android:drawable="@android:color/transparent" />
瞧。编译运行。它现在应该可以工作了。
关于android - Drawable 的 mutate 方法 Android 1.6 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272706/
我知道如果 Android 在所需的文件夹中找不到图标,它会尽力而为,但我看到有些地方他们建议上述所有内容,而在其他地方他们不包括 drawable ? 那么,如果所有其他的都充满了我的标签图标图像,
这个问题在这里已经有了答案: I am confused with drawable-hdpi and drawable-mdpi (4 个答案) 关闭 9 年前。 我真的很困惑,res下的andr
我正在进行一个非常大的项目,该项目是在 android 1.5 时代开始的。 这个项目随着 android 的发展而发展,目前支持 2.3 及更高版本。 现在我遇到了这个问题,我在 drawable-
所有 Android 文档都提到了“drawable”目录。但是,当我在 Eclipse 中创建 Android 项目时,它不会创建“/res/drawable”目录,但会创建“/res/drawab
我正在使用 Android 1.5,但我现在已迁移到最新版本。所以 Android 1.5 中只有一个“drawable”文件夹,但现在 Android 项目中有三个不同的文件夹用于存储图像。 我发现
当我创建一个新项目时,我的 Android studio 1.0 不显示 drawable-hdpi、drawable-xhdpi、drawable-mdpi 和 drawable-xxhdpi。 我
我将 9-patch 文件从 /drawable 移到了 /drawable-hdpi 因为错误日志推荐使用 drawable-* 提供密度优化图像。 问题是,AppWidget 现在看起来不一样了。
我可以知道这个错误是什么以及对此的解决方案吗?此错误在 Debug模式和 APK 中随机 react 原生应用程序时发生。重现这个错误很困难。 我在 github github-https://git
我能够将不同分辨率的图像保存在 res 文件夹的 drawable-hdpi、drawable-mdpi、drawable-ldpi 中,但不知道如何从 assets/www 文件夹访问图像。请帮忙。
我想为不同的本地化使用不同的图像。但是,我有所有分辨率和所有语言的图像。有没有办法做到这一点? 最佳答案 是的,有可能。可绘制-de-rDE-ldpi,可绘制-de-rDE-mdpi。检查一下。 关于
我的应用程序中有这个可绘制文件夹: 可绘制 drawable-hdpi、mdpi、ldpi、xhdpi 和 xxhdpi。 可绘制-sw240dp-land-xxxhdpi 可绘制-sw360dp-l
背景 我知道可以创建 Drawable(或位图)的旋转版本,因此(关于它的文章 here): @JvmStatic fun getRotateDrawable(d: Drawable, angle:
我有一个可绘制的状态列表,我想从可绘制的状态列表中获取一个特定的可绘制对象: 我为每个键选择正确的可绘制
如果您将可绘制对象放在/drawables 目录中,它们将被缩放,如果您想要不同密度的特定可绘制对象,您需要将它们放在特定目录中(/drawables-hdpi、/drawables-mdpi 等)
我熟悉@drawable,但在我克隆的 repo 中,我发现在引用项目中的可绘制对象时使用了@r$drawable。 对比 最佳答案 “$”(美元符号)用于引用 Android
我使用下面的代码通过手动给每个名称从 drawable 文件夹中获取 9(bird1 到 bird9)图像。 我如何使用数组或将 R.drawable.bird1 替换为变量(因为下面的语句只接受实际
据我了解,Android 的默认 DPI 设置等同于 MDPI。是否有任何理由同时拥有 drawable 和 drawable-mdpi 文件夹,或者如果我只是将它们放在 drawable 中,它们的
有什么区别吗 android:src="@andriod:drawable/filename" 和 android:src="@drawable/filename" 我可以在 xml 文件中以这种方式
我们在项目中提供各种密度的drawables是很常见的 drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxh
我有一个应用程序可以加载用户安装的应用程序并在 recyclerview 中显示列表(应用程序名称和图标)。 此异常在 android 8+ 设备上引发,也不是在所有设备型号上(主要在三星和华为设备上
我是一名优秀的程序员,十分优秀!