【问题标题】:I'm having trouble getting the Android Search Interface to work in the Action Bar我无法让 Android 搜索界面在操作栏中工作
【发布时间】:2014-01-30 03:00:14
【问题描述】:

我尝试按照指南 here 进行操作,但遇到了一些问题。我正确地让搜索图标出现在操作栏中,但我无法将 searchable configuration 附加到 SearchView。

我的 res/menu/options_menu.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/search"
          android:title="@string/search_title"
          android:icon="@drawable/search"
          android:showAsAction="collapseActionView|ifRoom"
          android:actionViewClass="android.widget.SearchView" />
</menu>

我的 res/xml/searchable.xml 文件(注意:我必须在 res 文件夹中创建一个“xml”文件夹,因为该文件夹不存在。但我认为这不会有什么不同?

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

我的 res/values/strings.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">Starting To Feel It</string>
<string name="single_post">Single Post View</string>
<string name="search">Search Activity</string>

<string name="action_settings">Settings</string>
<string name = "pagination_last">Last</string>
<string name = "pagination_next">Next</string>

<string name = "player_play">Play</string>
<string name = "player_previous">Previous</string>
<string name = "player_next">Next</string>
<string name = "player_playlist">Playlist</string>
<string name = "player_progress_bar">Progress Bar</string>

<string name="drawer_open">Open navigation drawer</string>
<string name="drawer_close">Close navigation drawer</string>


<string name="search_title">Search STFI</string>
<string name="search_hint">Search STFI</string>


<string name="menu_item_picture">Menu Item Picture</string>

</resources>

我的 AndroidManifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stfi"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@android:style/Theme.Holo.Light" >


    <activity
        android:name=".StartingToFeelIt"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <activity
        android:name=".activities.SinglePost"
        android:label="@string/single_post">

    </activity>

    <activity 
        android:name=".activities.SearchActivity" 
        android:label="@string/search">

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>


</application>

</manifest>

我所有的活动都扩展了一个我称为MenuActivity 的类,这里是MenuActivity.java 中定义的onCreateOptionsMenu 函数:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();

    System.out.println("The component name is " + this.getComponentName().toString());

    SearchableInfo info = searchManager.getSearchableInfo(getComponentName());

    if(info  == null)
    {
        System.out.println("It is null!");
    }

    searchView.setSearchableInfo(info);

    return true;
}

我总是得到这个函数中的信息为空。我不确定我在获取信息时做错了什么,我不知道如何解决它。我不确定你是否需要它,但下面是我的 SearchActivity 课程。现在它什么也不做,只是尝试显示搜索(但是,它永远不会被调用,因为搜索配置设置不正确)。该文件保存在 com.stfi.activities.SearchActivity.java 中。

另一个注意事项:当我在上面的函数中打印出组件名称时,我得到了The component name is ComponentInfo(com.stfi/com.stfi.StartingToFeelIt) 而不仅仅是 com.stfi.StartingToFeelIt。这让我相信我的 AndroidManifest 文件有问题,但我不知道这是否是我无法附加搜索配置的原因。

public class SearchActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    handleIntent(intent);
}

private void handleIntent(Intent intent) {

    if (Intent.ACTION_SEARCH.equals(intent.getAction()))
    {
        String query = intent.getStringExtra(SearchManager.QUERY);
        System.out.println("You are searchin " + query);
    }
}
}

【问题讨论】:

  • 如果有帮助,当我单击应用程序上的搜索图标时,我也看不到我在 res/xml/searchable.xml 文件中定义的 android:hint
  • 您的 SearchActivity 扩展了 Activity 而不是 MenuActivity ?
  • 应该没关系吧?我只想能够显示一些东西,任何东西,而不是担心我的 MenuActivity 类。
  • 您希望哪个活动可搜索(显示搜索菜单​​)?从清单文件中我看到了它的 SearchActivity,所以它应该(做菜单搜索的东西)扩展 MenuActivity。

标签: java android android-intent android-actionbar


【解决方案1】:

我一直在四处寻找,发现了两件你需要做的事情。

1. 更新您的 Manifest.xml 并使用 &lt;meta 添加您的搜索界面。

2.为了使其具有可搜索的配置,您需要添加元数据

<activity ... >
    ...
    <meta-data android:name="android.app.searchable"
            android:resource="@xml/searchable" />

</activity>

【讨论】:

    【解决方案2】:

    我猜可能是清单有问题,

    <meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />
    

    清单的活动标记中缺少“StartingToFeelIt”

     <activity
        android:name=".StartingToFeelIt"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    
        <meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />
    </activity>
    

    您也可以使用 ABS CollapsibleSearchMenu Lib。

    【讨论】:

      【解决方案3】:

      “我的 res/xml/searchable.xml 文件(注意:我必须在 res 文件夹中创建一个“xml”文件夹,因为该文件夹不存在。我认为这不应该成为一个不过有什么区别?”

      您可以根据需要添加文件夹,只要您遵循 xmls 命名空间的指导方针

      关于搜索,我不认为 minSdkVersion 和 targetSdkVersion 是正确的。

      根据Android's, Remaining Backward Compatible article,您应该使用

      <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />
      
      <application>
      ...
      

      【讨论】:

        【解决方案4】:
             <activity
                android:name="com.yourapp.YourSearchActivity"
                android:label="@string/title_activity_search"
                android:launchMode="singleTop" >
                <intent-filter>
                    <action android:name="android.intent.action.SEARCH" />
                </intent-filter>
        
                <meta-data
                    android:name="android.app.searchable"
                    android:resource="@xml/searchable" />
            </activity>
        

        在我的活动菜单 XML 中:

        <menu xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            tools:context="com.example.mirrorcamera.MainActivity" >
        
            <item
                android:id="@+id/search"
                android:showAsAction="always"
                android:title="@string/string_title"/>
        
        </menu>
        

        Java 代码:

        public class SearchActivity extends ListActivity {
        
            private static final int             ICON = R.drawable.ic_ab_back_holo_light;
            private SearchDataBaseAdapter        searchDataBaseAdapter;
            private ArrayList<SearchResultModel> searchResultList;
            private ResultListAdapter            resultListAdapter;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_search);
        
                super.onCreate(savedInstanceState);
        
                searchResultList = new ArrayList<SearchResultModel>();
        
                // gets the db reference from adapter
                searchDataBaseAdapter = new SearchDataBaseAdapter(this);
                searchDataBaseAdapter.open();
        
                handleIntent(getIntent());
        
            }
        
        
        
            /**
             * Handles the intent from the search.
             * 
             * @param intent
             */
            private void handleIntent(Intent intent) {
                if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
                    // handles a search query
                    String query = intent.getStringExtra(SearchManager.QUERY);
                    search(query);
        
                }
            }
        
        
        
            @Override
            public void onNewIntent(Intent intent) {
                // super.onNewIntent(intent);
                setIntent(intent);
                handleIntent(intent);
            }
        
            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
        
                switch (item.getItemId()) {
        
                case R.id.search:
                    onSearchRequested();
                    break;
                }
        
                return true;
            }
        
            /**
             * Search function.
             * 
             * @param searchTerm
             */
            public void search(String searchTerm) {
        
                try {
                    Cursor cursor = searchDataBaseAdapter.getWordMatches(searchTerm, null);
                    //create and add your list to your adapter.
                    resultListAdapter = new ResultListAdapter(this, itemsFound(cursor, cursor.getString(cursor.getColumnIndex("YOUR_COLUMN"))));
                } catch (NullPointerException ex) {
                    Toast.makeText(this, "Search Term not found", Toast.LENGTH_LONG).show();
                    ex.getStackTrace();
        
                }
        
                setListAdapter(resultListAdapter);
        
            }
        
            /**
             * Returns the items found and writes the items found to an arraylist.
             * @return
             */
            private ArrayList<SearchResultModel> itemsFound(Cursor cursor, String itemName, String     itemDescription, int type) {
                // ArrayList<String> list = new ArrayList<String>();
        
                if (cursor.moveToFirst()) {
                    do {
                        searchResultList.add(new SearchResultModel(itemName, itemDescription, type, ICON));
                    } while (cursor.moveToNext());
                }
                cursor.close();
        
                return searchResultList;
            }
        
        
        }
        

        希望对你有帮助

        【讨论】:

        • 未来,您可能想解释一下您所拥有的。简单地给某人代码实际上并没有那么有用。
        猜你喜欢
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多