4

我已经安装了支持库以使操作栏也在 android pre API 11 中工作

当我启动应用程序时,logcat 给出了这个错误:

08-20 19:54:41.600: I/dalvikvm(9828): Failed resolving Landroid/support/v7/widget/SearchView$5; interface 809 'Landroid/view/View$OnLayoutChangeListener;'

08-20 19:54:41.600: W/dalvikvm(9828): Link of class 'Landroid/support/v7/widget/SearchView$5;' failed

08-20 19:54:41.600: E/dalvikvm(9828): Could not find class 'android.support.v7.widget.SearchView$5', referenced from method android.support.v7.widget.SearchView.addOnLayoutChangeListenerToDropDownAnchorSDK11

08-20 19:54:41.600: W/dalvikvm(9828): VFY: unable to resolve new-instance 734 (Landroid/support/v7/widget/SearchView$5;) in Landroid/support/v7/widget/SearchView;

08-20 19:54:41.600: D/dalvikvm(9828): VFY: replacing opcode 0x22 at 0x0002

08-20 19:54:41.600: D/dalvikvm(9828): VFY: dead code 0x0004-000a in Landroid/support/v7/widget/SearchView;.addOnLayoutChangeListenerToDropDownAnchorSDK11 ()V

谁能帮帮我,我在网上搜索,但我什么也没找到。谢谢

MainActivity.Java

    package com.example.fanculo;

    import android.os.Bundle;
    import android.app.SearchManager;
    import android.content.Context;
    import android.support.v4.view.MenuItemCompat;
    import android.support.v7.widget.SearchView;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.ActionBarActivity;
    import android.view.Menu;
    import android.view.MenuItem;


    public class MainActivity extends ActionBarActivity{

ActionBar actionBar;

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

    actionBar = getSupportActionBar();
    actionBar.setTitle("Test");

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

     SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    // Configure the search info and add any event listeners
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
     searchView.setIconifiedByDefault(true); 
    return super.onCreateOptionsMenu(menu);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

}

4

3 回答 3

8

我认为这是支持库中 SearchView.java 类中的一个错误,您可以看到它在一个通用实现文件中使用 View.OnLayoutChangeListener:

https://android.googlesource.com/platform/frameworks/support.git/+/android-4.3_r1/v7/appcompat/src/android/support/v7/widget/SearchView.java

这使得类加载器尝试加载自 api 级别 11 起可用的 View.OnLayoutChangeListener - 即使甚至没有调用此 *SDK11 方法。我想这个方法 addOnLayoutChangeListenerToDropDownAnchorSDK11 应该移动到外部 java 类并且仅在设备 API >= 11 时使用。

您可以将此代码复制到您自己的活动中重现此错误:

private void addOnLayoutChangeListenerToDropDownAnchorSDK11() {
    new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                   int oldLeft, int oldTop, int oldRight, int oldBottom) {
        }
    };
}

public void onCreate(...) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            addOnLayoutChangeListenerToDropDownAnchorSDK11();
        }
}

以下是 logcat 打印的内容:

08-31 22:50:33.030: INFO/dalvikvm(20753): Failed resolving Lcom/example/ActionBarTester/MyActivity$1; interface 813 'Landroid/view/View$OnLayoutChangeListener;'
08-31 22:50:33.030: WARN/dalvikvm(20753): Link of class 'Lcom/example/ActionBarTester/MyActivity$1;' failed
08-31 22:50:33.030: ERROR/dalvikvm(20753): Could not find class 'com.example.ActionBarTester.MyActivity$1', referenced from method com.example.ActionBarTester.MyActivity.addOnLayoutChangeListenerToDropDownAnchorSDK11
08-31 22:50:33.030: WARN/dalvikvm(20753): VFY: unable to resolve new-instance 903 (Lcom/example/ActionBarTester/MyActivity$1;) in Lcom/example/ActionBarTester/MyActivity;
08-31 22:50:33.030: DEBUG/dalvikvm(20753): VFY: replacing opcode 0x22 at 0x0000
08-31 22:50:33.030: DEBUG/dalvikvm(20753): VFY: dead code 0x0002-0005 in Lcom/example/ActionBarTester/MyActivity;.addOnLayoutChangeListenerToDropDownAnchorSDK11 ()V

我不确定这个错误是否真的导致任何问题,在我的情况下 SearchView 在 API 级别 10 上工作,以上测试也允许我的活动工作。也许我在这里遗漏了一些东西。

于 2013-08-31T21:01:44.397 回答
0

使用 ActionBarSherlock 怎么样?它很灵活,也支持旧版本,而且很容易实现。

您所要做的就是将您扩展 Activity 的每个类切换到 SherlockActivity 和 Also 片段。我建议你试试看! https://github.com/JakeWharton/ActionBarSherlock

于 2013-08-31T21:52:58.250 回答
-1

您需要确保在 Eclipse 中正确添加 Android V7 支持库,以从日志中删除以下错误“找不到从方法 android.support.v7.widget.SearchView 引用的类 android.support.v7.widget.SearchView$5。 addOnLayoutChangeListenerToDropDownAnchorSDK11'。

关键要记住,添加支持库时不要忘记取消选中 Android 依赖项,因为 v7 appcompat 库有资源。在您的支持库项目中更改您的依赖项后,清理支持库项目就是这样。

关于如何使用资源添加支持库,请参阅官方 Google doco 的使用资源添加库部分中的完整过程。

如果将来链接更改,请从上面引用的 doco 中摘录:

  1. 确保您已使用 SDK 管理器下载了 Android 支持库。
  2. 创建一个库项目并确保所需的 JAR 文件包含在项目的构建路径中:
    • 选择文件 > 导入。
    • 选择 Existing Android Code Into Workspace 并单击 Next。
    • 浏览至 SDK 安装目录,然后浏览至 Support Library 文件夹。例如,如果您要添加 appcompat 项目,请浏览到 /extras/android/support/v7/appcompat/。
    • 单击完成以导入项目。对于 v7 appcompat 项目,您现在应该会看到一个名为 android-support-v7-appcompat 的新项目。
    • 在新的库项目中,展开 libs/ 文件夹,右键单击每个 .jar 文件并选择 Build Path > Add to Build Path。例如,在创建 v7 appcompat 项目时,将 android-support-v4.jar 和 android-support-v7-appcompat.jar 文件都添加到构建路径中。
    • 右键单击项目并选择构建路径 > 配置构建路径。在 Order and Export 选项卡中,检查您刚刚添加到构建路径的 .jar 文件,以便它们可用于依赖此库项目的项目。例如,appcompat 项目要求您同时导出 android-support-v4.jar 和 android-support-v7-appcompat.jar 文件。
    • 取消选中 Android 依赖项。
    • 单击确定以完成更改。
于 2013-09-05T08:13:37.557 回答