0

我正在开发一个应用程序,它应该支持多个 android sdk 版本。它使用 ActionBarSherlock 库和滑动菜单。在 android 4.0+ 上,该应用程序运行良好。但是当我尝试在所有具有较低 sdk 版本的设备上运行它时,应用程序崩溃并出现奇怪的错误。这是堆栈跟踪:

08-08 11:54:11.626: ERROR/dalvikvm(4782): Could not find class 'ru.arsenalmedia.AvatatorActivity', referenced from method ru.arsenalmedia.Auth.complete
08-08 11:54:11.646: ERROR/dalvikvm(4782): Could not find class 'ru.arsenalmedia.AvatatorActivity', referenced from method ru.arsenalmedia.Auth.onActivityResult
08-08 11:54:11.696: ERROR/ResourceType(4782): Style contains key with bad entry: 0x010102ce
08-08 11:54:12.346: ERROR/dalvikvm(4782): Could not find class 'android.os.StrictMode$ThreadPolicy$Builder', referenced from method ru.arsenalmedia.proto.Utils.enableStrictMode
08-08 11:54:18.346: ERROR/AndroidRuntime(4782): FATAL EXCEPTION: main
        java.lang.NoClassDefFoundError: ru.arsenalmedia.AvatatorActivity
        at ru.arsenalmedia.Auth.complete(Auth.java:119)
        at ru.arsenalmedia.proto.ServiceWorker$ClientRequest$2.handleMessage(ServiceWorker.java:951)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:143)
        at android.app.ActivityThread.main(ActivityThread.java:4914)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
        at dalvik.system.NativeStart.main(Native Method)

显现:

   <uses-sdk
          android:minSdkVersion="8"
          android:maxSdkVersion="17"
            />
<application android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:name="ru.arsenalmedia.Avatator"
             android:theme="@style/actionBarStyle"
        >
    <activity
            android:screenOrientation="portrait"
            android:name="ru.arsenalmedia.Auth"
            android:label="@string/app_name"
            android:clearTaskOnLaunch="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
            android:label="@string/app_name"
            android:name="ru.arsenalmedia.AvatatorActivity"
            android:screenOrientation="portrait"
            >
    </activity>
    <activity android:name="ru.arsenalmedia.SlidingPanelActivity" />
    <activity android:name="ru.arsenalmedia.TestAct"/>

</application>

我想,那是因为滑动菜单。我尝试使用本机 SlidingPaneLayout,但问题是一样的。我读了很多关于此的内容,但没有任何帮助。请帮忙 !!!

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
import ru.arsenalmedia.avatator.R;
import ru.arsenalmedia.proto.ContactInfo;
import ru.arsenalmedia.proto.GroupInfo;
import ru.arsenalmedia.proto.ServiceWorker;

public class AvatatorActivity extends SlidingFragmentActivity implements SearchView.OnQueryTextListener, MenuItem.OnActionExpandListener {

    private static final String TAG = "AvatatorActivity";
    protected Fragment mFragment;
    private SearchView searchView;

    private Menu menu;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTitle(R.string.app_name);
        actionBarInit();

        // set the Above View
        if (savedInstanceState != null)
            mFragment = getSupportFragmentManager().getFragment(savedInstanceState, "mFragment");
        if (mFragment == null)
            mFragment = new GroupsList();
        //searchView = (EditText) findViewById(R.layout.contact_search_edittext);

        setContentView(R.layout.content_frame);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.content_frame, mFragment)
                .commit();

        // set the Behind View
        setBehindContentView(R.layout.menu_frame);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.menu_frame, new AppMenuFragment())
                .commit();

        customizeSlidingMenu();
        //updateMenuTitles();
        invalidateOptionsMenu();
    }

    private void actionBarInit() {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        setSlidingActionBarEnabled(false);
    }

    private void customizeSlidingMenu() {
        SlidingMenu sm = getSlidingMenu();
        sm.setShadowWidthRes(R.dimen.shadow_width);
        sm.setShadowDrawable(R.drawable.shadow);
        sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        sm.setFadeDegree(0.35f);
        sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        sm.setBackgroundResource(R.drawable.sliding_menu_selector);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, "mFragment", mFragment);
    }

    public void switchContent(Fragment fragment) {
        Log.d(TAG, "SWITCH CONTENT");
        mFragment = fragment;
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.content_frame, fragment)
                .commit();
        //updateMenuTitles();
        invalidateOptionsMenu();
        getSlidingMenu().showContent();
    }
4

4 回答 4

2

你在使用eclipse adt插件吗?如果是这样,只需右键单击项目->属性->Java Build apth->Order and export,然后检查Android Dependencies。在此处输入图像描述

编辑:当您使用 Intellij 时,您是否检查过是否已将 SlidingMenu 库作为模块导入?在此处输入图像描述

附言。,我正在使用 Android Studio 和 Maven,如果您不使用 Maven,我认为您可以将项目作为库导入。

于 2013-08-08T02:28:00.530 回答
1

StrictMode是在 API 级别 9(版本 2.3)中引入的,因此您正在测试的旧版本一定不能调用它...

08-08 11:54:12.346: ERROR/dalvikvm(4782): Could not find class 'android.os.StrictMode$ThreadPolicy$Builder', referenced from method ru.arsenalmedia.proto.Utils.enableStrictMode

当您调用 Utils.enableStrictMode() 方法时,您应该首先检查用户设备是否正在运行可以访问 StrictMode 的版本。

编辑: 这样的事情也可能导致问题;在您的 styles.xml 中使用旧平台中不存在的 xml 属性,根据这一行:

08-08 11:54:11.696: ERROR/ResourceType(4782): Style contains key with bad entry: 0x010102ce

它仍然不能解释你的 NoClassDefFoundError

于 2013-08-08T01:05:05.467 回答
1

这是一个非常难以捉摸的问题。您提到它适用于 Android 4.0+,这会引发警报,您​​可能正在使用旧版本的 Android 不支持的东西。

但在此之前,如果您使用的是 Eclipse,您应该刷新您的项目并进行干净的构建。有时 Eclipse 在获取 AndroidManifest 更改时遇到问题,您可能会在模拟器/设备上加载旧版本。

如果仍然失败,则可能是您正在导入旧 API 中不支持的内容,或者 AvatatorActivity 类扩展了仅在较新 API 中可用的内容。您可以为您的 AvatatorActivity 发布一些代码(即导入和 AvatatorActivity 扩展的内容)吗?

了解您为 android:minSdkVersion 和 android:targetSdkVersion 设置的内容也会有所帮助。

======== 编辑 ========

感谢您发布代码。SlidingFragmentActivity 非常可疑,很可能缺少这个库。最简单的调试方法是保存当前 AvatatorActivity.java 的副本并将其替换为以下内容,以查看是否可以启动活动。

public class AvatatorActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle(R.string.app_name);
    }
}

如果这个准系统 Activity 启动,那么您的 SlidingMenu 设置有问题。

于 2013-08-08T02:21:48.373 回答
0

谢谢大家,我找到了解决办法。这是 SearchView 的问题。您应该使用 ActionBarSherlock 或 SupportLibrary 中的一个

于 2013-08-08T04:50:29.130 回答