Android ActionBarSherlock选项卡,Android 2.3或更低版本的NoClassDefFoundError

时间:2012-11-17 01:41:51

标签: android android-fragments android-actionbar actionbarsherlock

我正在努力让我的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的设备上运行它,即Android版本低于3.0。因此,ActionBarSherlock似乎无法正常工作。

我得到的错误是:

  

ERROR / dalvikvm(330):找不到类com.shockwave.clockproj.StopwatchFragment',从方法com.shockwave.clockproj.ClockMain.onCreate中引用   11-16 16:23:50.165:ERROR / 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或更低版本上找到。我该如何解决?

2 个答案:

答案 0 :(得分:3)

可能正在发生,因为导入的ActionBar.TabListener来自Android软件包而不是ActionBarSherlock软件包。

确保导入适用于com.actionbarsherlock.app.ActionBar.TabListener

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

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

  • 运行Android Lint以检查是否只有较新API级别的方法调用。

答案 1 :(得分:1)

enter image description here 尝试添加lib进行导出,这是因为找到类的编译时间但是在运行时没有,尝试添加要导出的库,如上图所示

你的案例中的lib是sherlock项目