J'ai implémenté la dernière bibliothèque appcompat et j'utilise la Toolbar
barre d'action as. Mais le problème est que je ne peux pas attraper l'événement de clic sur le bouton d'accueil / l'icône du hamburger. J'ai tout essayé et tout regardé mais je ne semble pas trouver de problème similaire.
Voici ma Activity
classe:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Set up the drawer.
navDrawerFragment =
(NavigationDrawerFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_drawer);
navDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout),
toolbar);
}
Et voici ma classe NavigationDrawerFragment:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
currentSelectedPosition = savedInstanceState.getInt(
STATE_SELECTED_POSITION);
fromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(currentSelectedPosition);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like
// to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
drawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
drawerListView.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
selectItem(position);
}
});
//mDrawerListView.setAdapter();
//mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return drawerListView;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
fragmentContainerView = getActivity().findViewById(fragmentId);
this.drawerLayout = drawerLayout;
// set a custom shadow that overlays the main
// content when the drawer opens
drawerLayout.setDrawerShadow(
R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view
// with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
drawerToggle = new ActionBarDrawerToggle(
getActivity(),
drawerLayout,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
// If the user hasn't 'learned' about the drawer,
// open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!userLearnedDrawer && !fromSavedInstanceState) {
drawerLayout.openDrawer(fragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
drawerLayout.post(new Runnable() {
@Override
public void run() {
drawerToggle.syncState();
}
});
drawerLayout.setDrawerListener(drawerToggle);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, currentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("cek", "item selected");
if (drawerToggle.onOptionsItemSelected(item)) {
Log.d("cek", "home selected");
return true;
}
return super.onOptionsItemSelected(item);
}
lorsque j'ai cliqué sur un élément de menu, le journal "élément sélectionné" est appelé. Mais lorsque je clique sur le bouton d'accueil, cela ouvre le tiroir de navigation mais le journal "accueil sélectionné" n'est jamais appelé. J'ai également défini la onOptionsItemSelected
méthode dans mon Activity
, mais elle n'est toujours pas appelée.
la source
dans mon cas, ce code fonctionne parfaitement
la source
C'est ainsi que je le fais pour revenir au bon fragment, sinon si vous avez plusieurs fragments au même niveau, il reviendrait au premier si vous ne remplacez pas le comportement du bouton de retour de la barre d'outils.
la source
Je pense que la bonne solution avec la bibliothèque de support 21 est la suivante
la source
this.getResValues().homeIconDrawable()
, qui estthis
?et dans chaque
onViewCreated
j'appellela source
C'est ainsi que j'ai mis en œuvre sa conception pré-matérielle et cela semble toujours fonctionner maintenant que je suis passé au nouveau
Toolbar
. Dans mon cas, je veux connecter l'utilisateur s'il tente d'ouvrir la navigation latérale en étant déconnecté (et attraper l'événement pour que la navigation latérale ne s'ouvre pas). Dans votre cas, vous ne pourriez pasreturn true;
.la source
J'ai changé un peu le DrawerLayout pour obtenir les événements et pouvoir consommer et événement, par exemple si vous souhaitez utiliser l'actionToggle comme retour si vous êtes en vue détaillée:
la source
L'approche la plus simple que nous pourrions faire est de changer l'icône d'accueil en icône connue et de comparer les dessinables (car l'icône android.R.id.home peut différer selon les versions d'API.
définissez donc une barre d'outils comme barre d'action SetSupportActionBar (_toolbar);
la source
Dans mon cas, j'ai dû mettre l'icône en utilisant:
Et puis écoutez les événements de clic avec onOptionsItemSelected par défaut et id android.R.id.home
la source
android.R.id.home
never firePour tous ceux qui recherchent une implémentation Xamarin (puisque les événements sont effectués différemment en C #), j'ai simplement créé cette
NavClickHandler
classe comme suit:Ensuite, attribuez un bouton de menu hamburger personnalisé comme celui-ci:
Et enfin, attribuer au menu du tiroir un basculeur ToolbarNavigationClickListener du type de classe que j'ai créé précédemment:
Et puis vous avez un bouton de menu personnalisé, avec les événements de clic gérés.
la source
Essayez ce code
Ajoutez le code ci-dessous à votre metod onCreate ()
la source