【问题标题】:Android, Logcat gives error about SearchView classAndroid,Logcat 给出关于 SearchView 类的错误
【发布时间】:2013-08-22 21:57:29
【问题描述】:

我已经安装了支持库以使操作栏在 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;
    }
}

}

【问题讨论】:

  • 是否在 build;d 路径中添加了 v4 库??
  • 嗨,我有这个库,但似乎android找不到,问题出在同一个库中,我对其他一些类没有问题,比如ActionBar,我把我的MainActivy的代码以上,希望有人能阻止我
  • 问题好像是android找不到android.support.v7.widget.SearchView;但我在图书馆有它

标签: android class error-handling runtime android-support-library


【解决方案1】:

我认为这是支持库中 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 上工作,以上测试也允许我的活动工作。也许我在这里遗漏了一些东西。

【讨论】:

  • 我同意这是 appcompat 库中的某种错误。一切似乎都正常工作;尽管如此,我还是讨厌在 LogCat 中看到红色墨水......
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    要记住的关键点,不要忘记在添加支持库时取消选中 Android 依赖项,因为 v7 appcompat 库有资源。对支持库项目中的依赖项进行更改后,清理支持库项目即可。

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

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

    1. 确保您已使用 SDK 管理器。
    2. 创建库项目并确保所需的JAR 文件包含在项目的构建路径中:
      • 选择文件 > 导入。
      • 选择 Existing Android Code Into Workspace 并单击 Next。
      • 浏览到 SDK 安装目录,然后到 Support 库文件夹。例如,如果您要添加 appcompat 项目,浏览到 /extras/android/support/v7/appcompat/。
      • 单击完成以导入项目。对于 v7 appcompat 项目,您 现在应该会看到一个名为 android-support-v7-appcompat 的新项目。
      • 在新建的库项目中,展开 libs/ 文件夹,右键单击每个 .jar 文件并选择构建路径 > 添加到构建路径。例如, 创建 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 依赖项。
      • 单击“确定”完成更改。

    【讨论】:

    • 这是我最初设置 v7 支持库时所做的,我逐字逐句地遵循了这一点。得到这个错误。按照你的建议回去看看我是否遗漏了什么。没有运气,仍然有同样的错误。我同意 marcin_j,这一定是一个错误。但是,我仍然可以正确使用 SearchView,所以我并没有为此烦恼...
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多