1

i have added menu item programatically now im performing action on it.But it is showing null pointer exception.

Below is the code

public boolean onPrepareOptionsMenu(com.actionbar.view.Menu menu) {
    // TODO Auto-generated method stub
    super.onPrepareOptionsMenu(menu);
    if(flag){
    menu.add(0, 9, 0, "").setIcon(android.R.drawable.ic_menu_search).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 1, 0, "Hindi").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 2, 0, "English").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 3, 0, "Gujarati").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 4, 0, "Punjabi").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 5, 0, "Bengali").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 6, 0, "Marathi").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 7, 0, "Talugu").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    menu.add(0, 8, 0, "Tamil").setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    flag=false;

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    mSearchView = (SearchView) menu.findItem(9).getActionView();
    mSearchView.setQueryHint(getResources().getString(R.string.search_hint));
    mSearchView.setIconifiedByDefault(false);
    mSearchView.setSubmitButtonEnabled(false);
    ((SearchView) searchItem.getActionView()).setIconified(true);
    mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    mSearchView.setFocusable(false);
    mSearchView.setQuery("", false);//
    mSearchView.setIconified(true); //
    mSearchView.clearFocus(); //
    searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

    mSearchView.setOnQueryTextListener(this);
    mSearchView.clearFocus();

    }

    return true;

}

This is where it is giving null at mSearchView.

mSearchView = (SearchView) menu.findItem(9).getActionView();

This is my onOptionItemSelected

@Override
public boolean onOptionsItemSelected(com.actionbar.view.MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home: {
        if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            mDrawerLayout.openDrawer(mDrawerList);
        }
        break;
    }

    case 0:
        return true;
    case 1:
        if (Locale.getDefault().toString().equalsIgnoreCase("hi")) 
        {

            //Toast.makeText(getApplicationContext(),getResources().getString(R.string.hin_sel), Toast.LENGTH_LONG).show();

        } else 
        {


            String languageToLoad = "hi"; // language
            Locale locale = new Locale(languageToLoad);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());


            Intent in=new Intent(getBaseContext(), MainActivity.class);
            startActivity(in);
            finish();

        }
        return true;

    case 2:
        if (Locale.getDefault().toString().equalsIgnoreCase("en")||Locale.getDefault().toString().equals("en_IN")||Locale.getDefault().toString().equals("en_US"))
        {


        //Toast.makeText(getApplicationContext(),getResources().getString(R.string.Al_Eng_sel), Toast.LENGTH_LONG).show();

        } else {

            String languageToLoad = "en"; // language
            Locale locale = new Locale(languageToLoad);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());


            Intent in=new Intent(getBaseContext(), MainActivity.class);
            startActivity(in);
            finish();
        }



        return true;



    default:
        System.out.println(item.getItemId());

    }


        // QuickContactFragment dialog = new QuickContactFragment();
        // dialog.show(getSupportFragmentManager(), "QuickContactFragment");
        // return true;



    return super.onOptionsItemSelected(item);
}
Yushi
  • 416
  • 6
  • 24

2 Answers2

3

To each dynamically added item setOnMenuItemClickListener like:

public boolean onPrepareOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        super.onPrepareOptionsMenu(menu);
        if(flag){
        menu.add(0, 9, 0, "").setIcon(android.R.drawable.ic_menu_search).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 1, 0, "Hindi").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 2, 0, "English").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 3, 0, "Gujarati").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 4, 0, "Punjabi").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 5, 0, "Bengali").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 6, 0, "Marathi").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 7, 0, "Talugu").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        menu.add(0, 8, 0, "Tamil").setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW).setOnMenuItemClickListener(this);
        flag=false;

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        mSearchView = (SearchView) menu.findItem(9).getActionView();
        mSearchView.setQueryHint(getResources().getString(R.string.search_hint));
        mSearchView.setIconifiedByDefault(false);
        mSearchView.setSubmitButtonEnabled(false);
        ((SearchView) searchItem.getActionView()).setIconified(true);
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setFocusable(false);
        mSearchView.setQuery("", false);//
        mSearchView.setIconified(true); //
        mSearchView.clearFocus(); //
        searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

        mSearchView.setOnQueryTextListener(this);
        mSearchView.clearFocus();

}

Implement your activity with OnMenuItemClickListener and override onMenuItemClick like:

@Override
public boolean onMenuItemClick(MenuItem item) {
    if(item.getTitle().equals("hindi")){
        //do something
    }
    return true;
}

You can also have a switch case on item id:

    @Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
    case 0:
        //do something
        break;

    default:
        break;
    }
    return true;
}
vipul mittal
  • 17,343
  • 3
  • 41
  • 44
  • Please review my onOptionItemSelected code.I have used switch case and its working fine.The problem is that mSearchView = (SearchView) menu.findItem(9).getActionView(); is getting null – Yushi Jan 17 '14 at 06:54
  • I think menu.findItem(9) should be changed. – Maveňツ Jan 17 '14 at 06:55
  • What should i change it with,it is its ID. – Yushi Jan 17 '14 at 06:56
  • on search view we have now 2 listeners,text-change and item click.i'M unable to expand the search view.What to do – Yushi Jan 17 '14 at 07:35
  • try: searchView.setIconified(false); from http://stackoverflow.com/questions/14235677/how-do-i-open-the-searchview-programmatically – vipul mittal Jan 17 '14 at 08:21
0

override onOptionsItemSelected() method in your fragment/activity

Derek
  • 632
  • 2
  • 11
  • 29