Нулевой указатель в SearchView AppCompatActivity?

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

 @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" />

и логарифм:

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, пожалуйста, дайте мне знать. Большое спасибо.


person Akshay chauhan    schedule 04.06.2015    source источник
comment
Это правильный ответ на ваш вопрос [stackoverflow.com/questions/27049294/ [1]: stackoverflow.com/questions/27049294/   -  person Hien Nguyen    schedule 04.10.2015


Ответы (3)


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

SManager.getSearchableInfo(getComponentName()

Тебе нужно

1. Объявите действие (которое должно выполнять поиск) для принятия намерения ACTION_SEARCH в элементе ‹intent-filter>.

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"/>

res/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>

Надеюсь, это решит вашу проблему, и для справки см. здесь.

person Amrit Pal Singh    schedule 04.06.2015
comment
он работает, но интерфейс поиска всегда открыт. в отличии.. сначала нажимаем, чем открывается для ввода - person Devendra Singh; 09.06.2015
comment
Если вы хотите открыть интерфейс поиска после клика, замените searchViewAction.setIconifiedByDefault(false); с true в приведенном выше коде внутри onCreateOptionsMenu() MainActivity. - person Amrit Pal Singh; 09.06.2015
comment
не могли бы вы взглянуть на этот вопрос. Адаптер менять пока не хочу. у меня такой же адаптер как и в этом вопросе. - person Devendra Singh; 09.06.2015

Эта ветка наполовину устарела, но ответы мне не помогли. Что сработало для меня, так это изменить «приложение» на «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>

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

person please delete me    schedule 05.10.2015

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

import android.support.v7.widget.SearchView
person AndreMoreira    schedule 09.07.2015