1

我的应用依赖于操作栏的 Android 支持库 V7 AppCompat(支持存储库版本 2)。Eclipse 中的该库项目在其 libs/ 目录中包含 Android Support Library V4(版本 18)作为依赖项。我的应用程序的项目文件夹不包含 libs/ 中的支持库,大概是依靠 AppCompat 来导出的。在大多数情况下,我的抽屉式导航代码类似于标准示例

在 Android 4+ 上一切正常,但在 Android 2 设备(Gingerbread 模拟器和 DROID 2)上,活动开始时我得到一个 VerifyError:

08-18 23:50:06.538: E/AndroidRuntime(6232): java.lang.VerifyError: com.myapp.activities.MainActivity$2
08-18 23:50:06.538: E/AndroidRuntime(6232):     at com.myapp.activities.MainActivity.onCreate(MainActivity.java:76)
08-18 23:50:06.538: E/AndroidRuntime(6232):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
...

事实证明,当我调用 ActionBarDrawerToggle 的构造函数时发生了崩溃。

import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    drawerView = (ListView)findViewById(R.id.left_drawer);
    drawerView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            selectItem(position);
        }
    });
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
    ...
}

请注意,先前对强制转换 DrawerLayout 的调用不会导致 VerifyError。

ADT 22,目标 API 17,最小 API 7。不使用 Proguard,我的 project.properties 很简单:

target=android-17
android.library.reference.1=../libraries/appcompat

我确实在我的构建路径上(在项目和 AppCompat 库项目中)将 Android Private Libraries 标记为导出条目,这似乎排除了支持库导致 VerifyError 的最常见原因之一。

4

1 回答 1

1

问题是使用 invalidateOptionsMenu() 而不是 supportInvalidateOptionsMenu()。

于 2013-08-19T21:20:11.890 回答