我无法让Android搜索界面在Action Bar中运行

我试着按照这里的指南,但我遇到了一些问题。 我正确地将搜索图标显示在操作栏中,但是我无法将searchable configuration附加到SearchView。

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

     

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

   

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

   Starting To Feel It Single Post View Search Activity Settings Last Next Play Previous Next Playlist Progress Bar Open navigation drawer Close navigation drawer Search STFI Search STFI Menu Item Picture  

我的AndroidManifest.xml文件:

                      

我的所有活动都扩展了一个名为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; } 

我总是在这个函数中获取该信息为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); } } } 

  • 如何将Writer转换为String
  • 使用ViewPager的Android ClassNotFoundException
  • 无法解析符号NameValuePair
  • AsyncTask varargs参数的用途
  • java.security.InvalidKeyException:android中的密钥大小或默认参数
  • 我应该在学习Android之前学习Java
  • 通过TCP套接字将音频写入服务器
  • 无法在新的Android Studio中findUI设计器
  • 我已经四处寻找并find了你需要做的两件事。

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

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

      ...   

    我猜可能是清单的问题,

      

    您的清单的“StartingToFeelIt”的活动代码中缺少

             

    你也可以使用ABS CollapsibleSearchMenu Lib。

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

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

    关于搜索,我不相信minSdkVersion和targetSdkVersion是对的。

    根据你应该使用的Android,Remaining Backward Compatible文章

       ... 
            

    在我的菜单XML中进行活动:

        

    Java代码:

     public class SearchActivity extends ListActivity { private static final int ICON = R.drawable.ic_ab_back_holo_light; private SearchDataBaseAdapter searchDataBaseAdapter; private ArrayList searchResultList; private ResultListAdapter resultListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); super.onCreate(savedInstanceState); searchResultList = new ArrayList(); // 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 itemsFound(Cursor cursor, String itemName, String itemDescription, int type) { // ArrayList list = new ArrayList(); if (cursor.moveToFirst()) { do { searchResultList.add(new SearchResultModel(itemName, itemDescription, type, ICON)); } while (cursor.moveToNext()); } cursor.close(); return searchResultList; } } 

    希望这可以帮助