Android ActionBarSherlock选项卡,Android 2.3或更低版本上的NoClassDefFoundError
我试图让我的Android应用程序在Android的较低版本上支持ActionBar,所以我使用的是ActionBarSherlock 4.2.0。我还使用同一个开发人员的NotificationCompat2-1.1.2来获得更好的通知支持 因此,该应用程序有ActionBar选项卡,我正在使用ActionBar.TabListener。我的实现如下所示:Android ActionBarSherlock选项卡,Android 2.3或更低版本上的NoClassDefFoundError,android,android-fragments,android-actionbar,actionbarsherlock,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> imp
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
}
}
出现错误的行是实例化选项卡的位置,如下所示:
ActionBar.Tab stopwatchTab = actionBar.newTab().setText("Stopwatch").setTabListener(new TabListener<StopwatchFragment>(this, "Stopwatch", StopwatchFragment.class));
显然,它找不到片段的类定义,但只能在Android 2.3或更低版本上找到。我该如何解决这个问题
尝试添加要导出的库,这是因为在编译时找到了类,但在运行时没有,请尝试添加要导出的库,如上图所示
你的例子中的lib是sherlock项目
尝试添加要导出的库,这是因为在编译时找到了类,但在运行时没有,请尝试添加要导出的库,如上图所示
您的例子中的lib是sherlock项目,这可能是因为导入的ActionBar.TabListener来自Android包,而不是ActionBar sherlock包 确保导入是针对com.actionbarsherlock.app.ActionBar.TabListener的 编辑:Shockwave自己解决了这个问题,但对于遇到这个问题的其他人来说:如果您在较低的API级别上遇到ClassNotFound异常,但它在较高的API级别上工作,那么您可以采取一些步骤来调试它 确保您没有实现任何在您的最低API级别中不可用的接口,例如使用API级别11之前的接口 运行Android Lint检查是否有对仅在较新API级别可用的方法的调用
这可能是因为导入的ActionBar.TabListener来自Android软件包,而不是ActionBarSherlock软件包 确保导入是针对com.actionbarsherlock.app.ActionBar.TabListener的 编辑:Shockwave自己解决了这个问题,但对于遇到这个问题的其他人来说:如果您在较低的API级别上遇到ClassNotFound异常,但它在较高的API级别上工作,那么您可以采取一些步骤来调试它 确保您没有实现任何在您的最低API级别中不可用的接口,例如使用API级别11之前的接口 运行Android Lint检查是否有对仅在较新API级别可用的方法的调用
我已经检查过了,它使用的是ActionBarSherlock提供的适当的TabListener,但它仍然不起作用。嗯,你能发布StopwatchFragment的代码吗?当我遇到像这样的ClassNotFound错误时,是因为我让我的片段/活动实现了一个API级别上不可用的接口。在我的例子中,它是一个OnSystemMiviabilityChangeListener。没有必要,你这样说实际上为我指明了正确的方向。我使用的是NumberPickers,这在2.3中显然不可用。我只是将实现更改为自定义库,所有这些都正常工作。现在数字游戏都搞砸了,但至少我解决了这个问题。我将把这个标记为答案,因为你在评论中为我指出了正确的方向,这是正确的做法吗?很高兴你解决了这个问题!我将更新答案,以查找在该API级别不可用的东西。我认为这个场景也是新的Android Lint规则的一个很好的候选。我已经检查过了,它正在使用ActionBarSherlock的适当的TabListener,但它仍然不起作用。嗯,你能发布StopwatchFragment的代码吗?当我遇到像这样的ClassNotFound错误时,是因为我让我的片段/活动实现了一个API级别上不可用的接口。在我的例子中,它是一个OnSystemMiviabilityChangeListener。没有必要,你这样说实际上为我指明了正确的方向。我使用的是NumberPickers,这在2.3中显然不可用。我只是将实现更改为自定义库,所有这些都正常工作。现在数字游戏都搞砸了,但至少我解决了这个问题。我将把这个标记为答案,因为你在评论中为我指出了正确的方向,这是正确的做法吗?很高兴你解决了这个问题!我将更新答案,以查找在该API级别不可用的东西。我认为这个场景也是Android Lint新规则的一个很好的候选。不幸的是,这似乎没有改变任何东西。不幸的是,这似乎没有改变任何东西。
ActionBar.Tab stopwatchTab = actionBar.newTab().setText("Stopwatch").setTabListener(new TabListener<StopwatchFragment>(this, "Stopwatch", StopwatchFragment.class));