Ich habe die neueste Appcompat-Bibliothek implementiert und die Toolbar
als Aktionsleiste verwendet . Das Problem ist jedoch, dass ich das Klickereignis für den Home-Button / das Hamburger-Symbol nicht abfangen kann. Ich habe alles versucht und gesucht, aber es scheint kein ähnliches Problem zu finden.
Das ist meine Activity
Klasse:
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);
}
Und das ist meine NavigationDrawerFragment-Klasse:
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);
}
Wenn ich auf ein Menüelement geklickt habe, wird das Protokoll "Element ausgewählt" aufgerufen. Wenn ich jedoch auf die Home-Schaltfläche klicke, wird die Navigationsleiste geöffnet, aber das Protokoll "Home ausgewählt" wird nie aufgerufen. Ich habe auch eine onOptionsItemSelected
Methode in meiner festgelegt Activity
, aber sie wird immer noch nicht aufgerufen.
quelle
In meinem Fall funktioniert dieser Code perfekt
quelle
So mache ich es, um zum richtigen Fragment zurückzukehren. Andernfalls, wenn Sie mehrere Fragmente auf derselben Ebene haben, würde es zum ersten zurückkehren, wenn Sie das Verhalten der Symbolleisten-Zurück-Schaltfläche nicht überschreiben.
quelle
Ich denke, die richtige Lösung mit der Support-Bibliothek 21 ist die folgende
quelle
this.getResValues().homeIconDrawable()
, wer istthis
?und in jedem
onViewCreated
rufe ich anquelle
So habe ich das Pre-Material-Design implementiert und es scheint immer noch zu funktionieren, jetzt habe ich auf das neue umgestellt
Toolbar
. In meinem Fall möchte ich den Benutzer anmelden, wenn er versucht, das seitliche Navigationssystem zu öffnen, während er abgemeldet ist (und das Ereignis abfangen, damit das seitliche Navigationssystem nicht geöffnet wird). In deinem Fall konntest du nichtreturn true;
.quelle
Ich habe das DrawerLayout ein wenig geändert, um die Ereignisse abzurufen und in der Lage zu sein, Ereignisse zu konsumieren, z. B. wenn Sie actionToggle als Zurück verwenden möchten, wenn Sie sich in der Detailansicht befinden:
quelle
Der einfachste Ansatz ist, das Home-Symbol in ein bekanntes Symbol zu ändern und Drawables zu vergleichen (da sich das android.R.id.home-Symbol von verschiedenen API-Versionen unterscheiden kann
Legen Sie daher eine Symbolleiste als Aktionsleiste fest. SetSupportActionBar (_toolbar);
quelle
In meinem Fall musste ich das Symbol setzen mit:
Hören Sie sich dann Klickereignisse mit der Standard-ID onOptionsItemSelected und android.R.id.home an
quelle
android.R.id.home
Niemals feuernFür alle, die nach einer Xamarin-Implementierung suchen (da Ereignisse in C # anders ausgeführt werden), habe ich diese
NavClickHandler
Klasse einfach wie folgt erstellt:Weisen Sie dann eine benutzerdefinierte Hamburger-Menüschaltfläche wie folgt zu:
Und schließlich wurde dem Schubladenmenü ein ToolbarNavigationClickListener des Klassentyps zugewiesen, den ich zuvor erstellt habe:
Und dann haben Sie eine benutzerdefinierte Menüschaltfläche, mit der Klickereignisse behandelt werden.
quelle
Versuchen Sie diesen Code
Fügen Sie Ihrem onCreate () -Metod den folgenden Code hinzu
quelle