在null引用上获取错误searchView

时间:2016-04-08 14:06:27

标签: android menu searchview

我在操作栏上有searchView,我这里是代码

public class container extends AppCompatActivity {

private ListView drawerList;
private DrawerLayout drawerLayout;
private Toolbar toolbar;
private ActionBarDrawerToggle toggle;
private TextView textContainer, titleContainer;
private ImageView imageContainer;
private drawerAdapter adapter;



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

    toolbar = (Toolbar) findViewById(R.id.mainToolbar);
    setSupportActionBar(toolbar);
    toolbar.setTitleTextColor(0xffffffff);

    titleContainer = (TextView) findViewById(R.id.containerTitle);
    textContainer = (TextView) findViewById(R.id.textContainer);
    imageContainer = (ImageView) findViewById(R.id.imageContainer);


    titleContainer.setText(R.string.UtrujjTitle);
    textContainer.setText(R.string.UtrujjContent);
    imageContainer.setImageResource(R.drawable.utrujj);

    final Animation animation = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);

    drawerLayout = (DrawerLayout) findViewById(R.id.mainDrawer);
    drawerList = (ListView) findViewById(R.id.drawerList);

    final SearchView searchView = (SearchView)findViewById(R.id.searchable);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                if (newText.length() > 0) {

                    Spannable spannable = new SpannableString(newText);
                    spannable.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, 100, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    textContainer.setText(spannable);
                }


                return false;

            }
        });

最后我添加了这些覆盖

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.search, menu);

    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){

        case R.id.searchable:

    return false;
        default:
            break;
    }

    return super.onOptionsItemSelected(item);
}

search.xml

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/setting"
        android:icon="@drawable/ic_setting"
        app:showAsAction="ifRoom"
        android:title="@string/setting"/>



    <item android:id="@+id/searchable"
          android:icon="@android:drawable/ic_menu_search"
          app:showAsAction="always"
          app:actionViewClass="android.support.v7.widget.SearchView"
          android:title="@string/search"/>
</menu>

当活动开始时我在logcat中收到此错误

Unable to start activity ComponentInfo{com.example.tina.tibbenabvi/com.example.tina.tibbenabvi.container}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setOnQueryTextListener(android.widget.SearchView$OnQueryTextListener)' on a null object reference

=============================================== =====

1 个答案:

答案 0 :(得分:0)

此视图这是一个菜单项,因此您应该初始化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();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            if (newText.length() > 0) {

                Spannable spannable = new SpannableString(newText);
                spannable.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, 100, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                textContainer.setText(spannable);
            }


            return false;

        }
    });

    return true;
}

修改

清单文件:

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

</activity>

创建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_name"
        android:hint="search..." />

创建可搜索的活动

public class SearchResultsActivity 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);
            //use the query to search your data somehow
        }
    }
    ...
}

并将其添加到清单文件中:

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

来自:

的信息

http://developer.android.com/intl/es/training/search/setup.html