2016-04-07 11 views
0

Ich habe eine MainActivity, auf der das Fragment platziert wird. Fragment mit SearchView (App: actionViewClass = "android.support.v7.widget.SearchView" ) und MainActivity hat ein SearchView-Symbol in der Toolbar. Ich möchte das Symbol aus der Werkzeugleiste verstecken/anzeigen, wenn die Suchansicht von Fragment anzeigen/ausblenden ist (wie die Flipkart-App). Es funktioniert einwandfrei, wenn einer von Verstecken oder Anzeigen-Verfahren verwendet wird, aber wenn ich sie beide verwenden dann gibt es Fehler wieDas Symbol für das Aktionsmenü wird nicht angezeigt.

java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.Menu.findItem(int)' on a null object reference 

Mein Code-Schnipsel sind ..

MainActivity

@Override 
public boolean onCreateOptionsMenu(final Menu menu) 
{ 
    _menu = menu; 
    final Menu m= menu; 
    getMenuInflater().inflate(R.menu.menus, menu); 
    final MenuItem searchItem = menu.findItem(R.id.action_search); 

    SearchManager searchManager = (SearchManager) DrawerActivity.this.getSystemService(Context.SEARCH_SERVICE); 

    SearchView searchView = null; 
    if (searchItem != null) { 
     searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    } 
    if (searchView != null) { 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    } 
    searchView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      m.performIdentifierAction(searchItem.getItemId(), 0); 
     } 
    }); 

    searchItem.setVisible(false); 
    return super.onCreateOptionsMenu(menu); 
} 

public void show_search(){ 

    final MenuItem searchItem = _menu.findItem(R.id.action_search); 
    searchItem.setVisible(true); 
//  invalidateOptionsMenu(); //if i use this it not show the icon. 
} 

public void hide_search() { 
    final MenuItem sitem = _menu.findItem(R.id.action_search); // gives NullPointerException in this line. 
    sitem.setVisible(false); 
    invalidateOptionsMenu(); 
} 

Fragment Code:

public class Fragment1 extends Fragment 
{ 

     scroll = (ScrollView) v.findViewById(R.id.scroll_view); 

// Total Height of layout which contains searchview 
    ViewTreeObserver vas = lin.getViewTreeObserver(); 
    vas.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      ViewGroup.MarginLayoutParams vlp = (ViewGroup.MarginLayoutParams) lin.getLayoutParams(); 
      search_size = lin.getMeasuredHeight() + vlp.topMargin; 
      lin.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

     } 
    }); 
     scroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 

     @Override 
     public void onScrollChanged() { 

      float y = scroll.getScrollY(); 

      DrawerActivity d = (DrawerActivity) getActivity(); 
      if (y >= search_size) 
      { 
       d.show_search(); 
      } 
      else 
      { 
       d.hide_search(); 
      } 
     } 
    }); 
} 

Antwort

0

Guten Morgen, warum bläst du nicht andere menu.xml das Fragment? Zum Beispiel .. in Ihrem Fragmente einfügen

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    setHasOptionsMenu(true); 
} 

private Menu mMenu; 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.menu_fragment, menu); 
    mMenu = menu; 

    MenuItem searchViewItem = menu.findItem(R.id.search); 

    final android.support.v7.widget.SearchView searchView = 
      (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchViewItem); 

    super.onCreateOptionsMenu(menu, inflater); 
} 

I

+0

Nein geholfen habe, du, er App nur versuchen Flipkart ich nur will das Suchsymbol in der Toolbar verbergen/zeigen beim Scrollen. –