15

Ho creato un'applicazione che utilizza Fragment. Dal mio MainActivity ho impostato l'ActionBar.Android Come modificare il menu della barra delle azioni da Fragment

Ma in uno dei miei frammenti ho bisogno di modificare le icone di azione e al clic.

Quindi, con il codice qui sotto, quando carico il mio frammento, ancora visualizzare il menu barra delle azioni da MainActivity

ecco la mia MainActivity:

public void restoreActionBar() { 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setTitle(mTitle); 

    // enable ActionBar app icon to behave as action to toggle nav drawer 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setHomeButtonEnabled(true); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if (!mNavigationDrawerFragment.isDrawerOpen()) { 
     // Only show items in the action bar relevant to this screen 
     // if the drawer is not showing. Otherwise, let the drawer 
     // decide what to show in the action bar. 
     getMenuInflater().inflate(R.menu.main, menu); 


     //Handle the Search Menu 
     SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); 
     searchView.setQueryHint(this.getString(R.string.action_search)); 

     ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)) 
     .setHintTextColor(getResources().getColor(R.color.white));  
     searchView.setOnQueryTextListener(OnQuerySearchView); 

     mSearchCheck = false; 


     restoreActionBar(); 
     return true; 
    } 

    return super.onCreateOptionsMenu(menu); 
}//end onCreateOptionsMenu 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    switch (item.getItemId()) { 

     /** CAMERA **/ 
     case R.id.action_camera: 
      //openCamera(); 
      Utils.makeToast(getApplicationContext(), "Implement Camera", false); 
      return true; 

     /** SEARCH **/ 
     case R.id.action_search: 
      //openSearch(); 
      mSearchCheck = true; 
      Utils.makeToast(getApplicationContext(), "Implement Search", false); 
      return true; 

     /** SETTINGS **/ 
     case R.id.action_settings: 
      //openSettings(); 
      Utils.makeToast(getApplicationContext(), "Implement Settings", false); 
      return true; 

     /** ABOUT **/ 
     case R.id.action_help: 
      //openHelp(); 
      Utils.makeToast(getApplicationContext(), "Implement Help", false); 
      return true; 


     default: 
      return super.onOptionsItemSelected(item); 
    }//end switch 
}//end onOptionsItemSelected 

private OnQueryTextListener OnQuerySearchView = new OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextSubmit(String arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 
    @Override 
    public boolean onQueryTextChange(String arg0) { 
     // TODO Auto-generated method stub 
     if (mSearchCheck){ 
      // implement your search here 
     } 
     return false; 
    } 
};//end OnQueryTextListener 

Qui è il layout:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.sellbeesclean.MainActivity" > 


    <!-- CAMERA --> 
    <item 
     android:id="@+id/action_camera" 
     android:orderInCategory="100" 
     android:icon="@drawable/ic_action_camera" 
     android:title="@string/action_camera" 
     app:showAsAction="ifRoom|collapseActionView"/> 

    <!-- SEARCH --> 
    <item 
     android:id="@+id/action_search" 
     android:orderInCategory="100" 
     android:icon="@drawable/ic_action_search" 
     android:title="@string/action_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="ifRoom|collapseActionView"/> 

    <!-- SETTINGS --> 
    <item 
     android:id="@+id/action_settings" 
     android:orderInCategory="100" 
     android:title="@string/action_settings" 
     app:showAsAction="never"/> 

    <!-- HELP --> 
    <item 
     android:id="@+id/action_help" 
     android:orderInCategory="100" 
     android:icon="@drawable/ic_action_help" 
     android:title="@string/action_help" 
     app:showAsAction="ifRoom|collapseActionView"/> </menu> 

il suo è il mio Frammento:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setHasOptionsMenu(true); 
     View rootView = inflater.inflate(R.layout.user_profile_fragment, container, false); 
     Log.i(TAG, "onCreateView"); 
..... 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater);  
     inflater.inflate(R.menu.fragment_menu, menu); 

    } 



    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle presses on the action bar items 
     switch (item.getItemId()) { 

      /** EDIT **/ 
      case R.id.action_edit: 
       //openEditProfile(); //Open Edit Profile Fragment 
       Utils.makeToast(MyApplication.getAppContext(), "Implement Camera", false); 
       return true; 



      default: 
       return super.onOptionsItemSelected(item); 
     }//end switch 
    }//end onOptionsItemSelected 

qui il layout del menu frammento

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.sellbeesclean.MainActivity" > 


    <!-- EDIT --> 
    <item 
     android:id="@+id/action_edit" 
     android:orderInCategory="100" 
     android:icon="@drawable/ic_action_edit" 
     android:title="@string/action_edit_profile" 
     app:showAsAction="ifRoom|collapseActionView"/></menu> 
+0

Ho anche legato activity.invalidateOptionsMenu() ;, ma non fortunato – Joolah

risposta

32

Nel metodo onCreateView del frammento scrivere

setHasOptionsMenu(true); 

e gonfiare il file XML di menu in modo onCreateOptionsMenu

In onCreateOptionsMenu di un frammento, scrivere

menu.clear(); 

prima del gonfiaggio dei menu

+0

la nuova icona viene visualizzata solo quando faccio clic sul cassetto di navigazione (quando il cassetto è aperto) altrimenti viene comunque caricata dal layout MainActivity – Joolah

+0

non è necessario chiamare il metodo restoreActionBar in un frammento – TechHelper

+0

Non sto chiamando restoreActionBar(), ora ha commentato. - Ho aggiornato il codice sopra. grazie – Joolah

Problemi correlati