【问题标题】:Android ActionBarSherlock Tabs, NoClassDefFoundError on Android 2.3 or lowerAndroid ActionBarSherlock 选项卡,Android 2.3 或更低版本上的 NoClassDefFoundError
【发布时间】:2012-11-17 15:28:09
【问题描述】:

我正在尝试让我的 Android 应用在较低版本的 Android 上支持 ActionBar,因此我使用的是 ActionBarSherlock 4.2.0。我还使用同一个开发人员的“NotificationCompat2-1.1.2”来获得更好的通知支持。

所以该应用程序具有 ActionBar 选项卡,我正在使用 ActionBar.TabListener。我的实现如下所示:

public static class TabListener<T extends SherlockFragment> implements ActionBar.TabListener {
    private final SherlockFragmentActivity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private android.support.v4.app.Fragment mFragment;

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
        //Do nothing
    }
}

我的片段扩展了 SherlockFragment 类。

所以这一切都很好,除非我尝试在不原生支持 ActionBar 的设备上运行它,即低于 3.0 的 Android 版本。因此,ActionBarSherlock 似乎无法正常工作,无法正常工作。

我得到的错误是:

错误/dalvikvm(330):找不到类 'com.shockwave.clockproj.StopwatchFragment',引用自方法 com.shockwave.clockproj.ClockMain.onCreate 11-16 16:23:50.165:错误/AndroidRuntime(330):致命异常:主要

   java.lang.NoClassDefFoundError: com.shockwave.clockproj.StopwatchFragment
    at com.shockwave.clockproj.ClockMain.onCreate(ClockMain.java:20)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

出现错误的行是实例化选项卡的位置,如下所示:

 ActionBar.Tab stopwatchTab = actionBar.newTab().setText("Stopwatch").setTabListener(new TabListener<StopwatchFragment>(this, "Stopwatch", StopwatchFragment.class));

显然它找不到片段的类定义,但只能在 Android 2.3 或更低版本上找到。我该如何解决?

【问题讨论】:

    标签: android android-fragments android-actionbar actionbarsherlock


    【解决方案1】:

    这可能是因为正在导入的 ActionBar.TabListener 来自 Android 包而不是 ActionBarSherlock 包。

    确保导入是针对com.actionbarsherlock.app.ActionBar.TabListener

    编辑: Shockwave 自己解决了这个问题,但对于遇到此问题的其他人来说:如果您在较低的 API 级别上遇到 ClassNotFound 异常,但它适用于较高的 API 级别,则有一些步骤你可以拿去调试一下。

    • 确保您没有实现任何在您的最低 API 级别中不可用的接口(例如,在 API 级别 11 之前使用 View.OnSystemUiVisibilityChangeListener

    • 运行 Android Lint 以检查对仅在较新 API 级别中可用的方法的任何调用。

    【讨论】:

    • 我已经检查过了,它使用了来自 ActionBarSherlock 的正确 TabListener,但它仍然无法正常工作。
    • 嗯,您可以发布 StopwatchFragment 的代码吗?当我遇到这样的 ClassNotFound 错误时,这是​​因为我让我的 Fragment/Activity 实现了一个在该 API 级别上不可用的接口。就我而言,它与 OnSystemUiVisibilityChangeListener 一起使用。
    • 不用了,你这么说确实给我指明了正确的方向。我使用的是 NumberPickers,它显然在 2.3 中不可用。我只是将实现更改为自定义库,并且一切正常。现在 NumberPickers 搞砸了,但至少我解决了这个问题。我会将其标记为答案,因为您在 cmets 中为我指明了正确的方向(这是正确的做法吗?)。
    • 很高兴你解决了它!我将更新答案以提及寻找该 API 级别不可用的东西。我认为这个场景也是新的 Android Lint 规则的一个很好的候选。
    【解决方案2】:

    尝试将库添加到导出,这是因为在编译时找到了类,但在运行时没有,尝试添加要导出的库,如上图所示

    你的库是夏洛克项目

    【讨论】:

    • 不幸的是,这似乎没有改变任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多