2014-01-10 54 views
15

我试过按照指南here,但我遇到了一些问题。我正确地将搜索图标显示在操作栏中,但我在将searchable configuration附加到SearchView时遇到问题。我无法让Android搜索界面在操作栏中工作

我RES /菜单/ 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 /价值/ 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,这里是onCreateOptionsMenu功能MenuActivity.java定义:

@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; 
} 

我一直都想与这些信息是在此函数中为null。我不确定我做错了什么,以获得信息是空的,我不知道如何解决它。我不确定是否需要它,但下面是我的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); 
    } 
} 
} 
+0

如果有帮助,我没有看到Android的:暗示,我在RES/XML定义/searchable.xm l文件,当我点击我的应用程序上的搜索图标 – jas7457

+0

您的SearchActivity扩展活动而不是MenuActivity? – JafarKhQ

+0

它应该没关系,应该吗?我只是想能够显示一些东西,任何事情,还没有担心我的MenuActivity类。 – jas7457

回答

1

可能问题清单我猜,

<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库您的清单的活动标签。

2

我一直在寻找,并发现你需要做的两件事。

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

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

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

</activity> 
1
 <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; 
    } 


} 

希望这可以帮助

+0

为了将来,你可能想解释你有什么。简单地给某人的代码实际上并不是那么有用。 –

1

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

因为您可以根据需要添加文件夹,只要您遵循了个XML命名空间

的guidlines至于搜索,我不相信的minSdkVersion和targetSdkVersion是正确的

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

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

<application> 
...