2015-06-04 2 views
3

Я просто новичок, и я искал этот вопрос, здесь был найден вопрос 4-5, но это не помогло мне. Я просто пытаюсь searchView в Actionbar, моя деятельность - это AppCompatActivity, мой код ниже. Я использую панель инструментов в этом упражнении. и с использованием этого library тоже. OncreatOptionMenu:Нулевой указатель в SearchView AppCompatActivity?

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 
    SearchManager SManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
    SearchView searchViewAction = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 
    searchViewAction.setSearchableInfo(SManager.getSearchableInfo(getComponentName())); 
    searchViewAction.setIconifiedByDefault(false); 

    return super.onCreateOptionsMenu(menu); 
} 

Xml:

<item android:id="@+id/action_search" 
    android:title="action_search" 
    MainActivity:showAsAction="ifRoom" 
    MainActivity:actionViewClass="android.support.v7.widget.SearchView" /> 

и LogCat:

java.lang.NullPointerException 
     at algonation.com.spm.MainActivity.onCreateOptionsMenu(MainActivity.java:183) 
     at android.app.Activity.onCreatePanelMenu(Activity.java:2571) 
     at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:277) 
     at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:84) 
     at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImplBase.java:251) 
     at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:84) 
     at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:449) 
     at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:66) 
     at android.os.Handler.handleCallback(Handler.java:808) 
     at android.os.Handler.dispatchMessage(Handler.java:103) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5292) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
     at dalvik.system.NativeStart.main(Native Method) 

Если вам нужен весь код MainActivity пожалуйста, дайте мне знать .. Спасибо так много.

+1

Это правильный ответ на ваш вопрос [http://stackoverflow.com/questions/27049294/searchview-doesnt-work-since-app-compat][1] [1]: http://stackoverflow.com/questions/27049294/searchview-doesnt-work-since-app-compat –

ответ

5

Вы получаете NullPointerException, потому что ниже строки возвращается null.

SManager.getSearchableInfo (getComponentName()

Вы должны

1 - Объявить деятельность (которая должна выполнять поиск), чтобы принять ACTION_SEARCH намерение, в < умышленный фильтр> элемент.

2 - Указать конфигурацию для поиска для использования, в течение < мета-данных> элементов.

Предполагая, что вы выполняете поиск в вашем MainActivity (который AppCompatActivity, как вы хотите) видеть ниже пример:

public class MainActivity extends AppCompatActivity { 

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


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.my_main, menu); 

    MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
    SearchView searchViewAction = (SearchView) MenuItemCompat 
      .getActionView(searchMenuItem); 

    // Get the SearchView and set the searchable configuration 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchableInfo searchableInfo = searchManager 
      .getSearchableInfo(getComponentName()); 
    searchViewAction.setSearchableInfo(searchableInfo); 
    searchViewAction.setIconifiedByDefault(false); 

    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

AndroidManifest.xml

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

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

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

    </activity> 

</application> 

меню/activity_main.xml

<item 
    android:id="@+id/action_search" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="ifRoom" 
    android:title="@string/action_search"/> 

Рез/XML/searchable.xml

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

Надеется, что это решит вашу проблему & для справки see here.

+0

его рабочий, но интерфейс поиска всегда открыт. в отличие от .. сначала мы нажимаем, чем открываем для ввода –

+1

Если вы хотите открыть интерфейс поиска после нажатия, замените searchViewAction.setIconifiedByDefault (false); с true в приведенном выше коде, присутствующем внутри MainActivity's onCreateOptionsMenu(). –

+0

Я получил это. Благодарю. –

1

На самом деле, просто убедитесь, что вы импортируете «android.support.v7.widget.SearchView» и НЕ «android.widget.SearchView»

import android.support.v7.widget.SearchView 
2

Эта нить наполовину старый, но ответы не» т работал для меня. Что сработало для меня, было изменение «приложения» для «appcompat».

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:appcompat="http://schemas.android.com/apk/res-auto" 
<item 
    android:id="@+id/action_search" 
    android:title="@string/search_title" 
    appcompat:actionViewClass="android.support.v7.widget.SearchView" 
    appcompat:showAsAction="always"/> 
</menu> 

Извините, мой английский.