gpt4 book ai didi

java - 为自定义按钮充气时发生 ClassNotFoundException(在手机上有效;在平板电脑上异常)

转载 作者:行者123 更新时间:2023-11-30 01:59:40 25 4
gpt4 key购买 nike

我实现了一个自定义按钮,它在我的 Nexus 5 手机中毫无问题地膨胀。但是,当我尝试在 Samsung Galaxy 平板电脑(甚至是 BQ Edison 平板电脑)中运行它时,它会在为 Button 充气时抛出 ClassNotFoundException。

在调试和 Release模式下都会抛出异常,无论是否使用混淆器。你知道是什么原因造成的吗?有什么办法可以解决吗?

异常(exception)情况:

android.view.InflateException: Binary XML file line #38: Error inflating class com.appx.ui.ExpandedTouchButton
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at com.appx.ui.animation.HowScreenFragment.onCreateView(HowScreenFragment.java:142)
at android.app.Fragment.performCreateView(Fragment.java:1700)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.appx.ui.ExpandedTouchButton" on path: DexPathList[[zip file "/data/app/com.appx-4.apk"],nativeLibraryDirectories=[/data/app-lib/com.appx-4, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at android.view.LayoutInflater.createView(LayoutInflater.java:565)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at com.appx.ui.animation.HowScreenFragment.onCreateView(HowScreenFragment.java:142)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)

这是 Java 声明代码:

package com.appx.ui;
public class ExpandedTouchButton extends FrameLayout implements ViewTreeObserver.OnPreDrawListener {
//...
}

下面是布局 XML 文件中的 Button 用法:

<com.appx.ui.ExpandedTouchButton
android:id="@+id/btnLogIn"
android:layout_width="240dp"
android:layout_height="44dp"
android:layout_gravity="center"
android:layout_marginTop="0dp"
android:textSize="20dp"
android:textColor="@color/text_white"
android:text="@string/log_in"
android:background="@drawable/login_button" />

谢谢!


编辑1

我已经尝试了以下指令,它是我从 LayoutInflater.createView() 代码复制而来的,它会抛出 ClassNotFoundException。不管是什么,这似乎是一个类加载问题。

Class clazz = getActivity().getClassLoader()
.loadClass("com.appx.ui.ExpandedTouchButton")
.asSubclass(View.class);

另外,下面的代码会抛出一个NoClassDefFoundError...

Class clazz = ExpandedTouchButton.class.getClassLoader()
.loadClass("com.appx.ui.ExpandedTouchButton").asSubclass(View.class);

最佳答案

抱歉,我发布的信息似乎永远不足以得到答案。

问题实际上是我启用了多索引(https://developer.android.com/intl/es/tools/building/multidex.html)。

我没有正确设置多索引(即我没有在 Android list 中将我的应用程序配置为 MultiDexApplication)。因此,我的 Android 5.1.1 的 Nexus 5 能够访问所有的类(class),但三星的 4.4.2 平板电脑却不能。我假设平板电脑只在一个 dex 文件中搜索类文件(而不是在生成的两个文件中)。

我设法通过仅导入部分谷歌服务库 (com.google.android.gms:play-services-plus:7.5.0) 而不是整个库来减少依赖项的数量。换句话说,我禁用了 multidexing 并且它起作用了

关于java - 为自定义按钮充气时发生 ClassNotFoundException(在手机上有效;在平板电脑上异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31684361/

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