Zaimplementowałem najnowszą bibliotekę appcompat i używam Toolbar
paska akcji jako paska akcji. Ale problem polega na tym, że nie mogę złapać zdarzenia kliknięcia przycisku głównego / ikony hamburgera. Próbowałem i szukałem wszystkiego, ale nie wydaje się, aby znaleźć podobny problem.
To jest moja Activity
klasa:
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);
}
A to jest moja klasa 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);
}
kiedy kliknąłem pozycję menu, zostanie wywołana pozycja dziennika „wybrana pozycja”. Ale kiedy klikam przycisk strony głównej, otwiera się szuflada nawigacji, ale dziennik „wybrany dom” nigdy nie jest wywoływany. Ustawiłem również onOptionsItemSelected
metodę w moim Activity
, ale nadal nie jest wywoływana.
źródło
w mycase ten kod działa idealnie
źródło
W ten sposób robię to, aby powrócić do właściwego fragmentu, w przeciwnym razie, jeśli masz kilka fragmentów na tym samym poziomie, powrócisz do pierwszego, jeśli nie zmienisz zachowania przycisku Wstecz na pasku narzędzi.
źródło
Myślę, że prawidłowe rozwiązanie z obsługą biblioteki 21 jest następujące
źródło
this.getResValues().homeIconDrawable()
, kto jestthis
?iw każdym
onViewCreated
wołamźródło
W ten sposób zaimplementowałem projekt przedmaterialny i wydaje się, że nadal działa, teraz przeszedłem na nowy
Toolbar
. W moim przypadku chcę zalogować użytkownika, jeśli spróbuje otworzyć nawigację boczną po wylogowaniu (i złapać zdarzenie, aby nawigacja boczna się nie otworzyła). W twoim przypadku nie mogłeśreturn true;
.źródło
Zmieniłem nieco DrawerLayout, aby uzyskać zdarzenia i móc konsumować i zdarzać, na przykład jeśli chcesz użyć actionToggle as back, jeśli jesteś w widoku szczegółowym:
źródło
Najłatwiejszym podejściem, jakie możemy zrobić, jest zmiana ikony domu na znaną ikonę i porównanie elementów do rysowania (ponieważ ikona android.R.id.home może się różnić w zależności od różnych wersji API
więc ustaw pasek narzędzi jako actionbar SetSupportActionBar (_toolbar);
źródło
W moim przypadku musiałem umieścić ikonę za pomocą:
Następnie słuchaj zdarzeń kliknięcia z domyślnymi identyfikatorami onOptionsItemSelected i android.R.id.home
źródło
android.R.id.home
nigdy nie strzelajDla każdego, kto szuka implementacji Xamarina (ponieważ zdarzenia są wykonywane inaczej w C #), po prostu utworzyłem tę
NavClickHandler
klasę w następujący sposób:Następnie przypisano niestandardowy przycisk menu hamburgera w następujący sposób:
I na koniec przypisano przełącznikowi menu szuflady ToolbarNavigationClickListener typu klasy, którą utworzyłem wcześniej:
Następnie masz niestandardowy przycisk menu z obsługą zdarzeń kliknięcia.
źródło
Wypróbuj ten kod
Dodaj poniższy kod do metody onCreate ()
źródło