Android lollipop toolbar Umschalten zwischen öffnen/schließen der Schublade und zurück-Taste
Hatte ich die standart-navigation Schublade, aber jetzt versuche ich es zu ändern, mit toolbar.
Früher mein code sah aus wie:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v("MAIN", "CREATE");
initViews();
setListeners();
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
});
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
//Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
NavigationDrawerFragment.java
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
((MainActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((MainActivity) getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
((MainActivity) getActivity()).getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().invalidateOptionsMenu(); //calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
//The user manually opened the drawer; store this flag to prevent auto-showing
//the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
if (mDrawerListView != null) {
}
getActivity().invalidateOptionsMenu(); //calls onPrepareOptionsMenu()
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
}
};
//If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
//per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
//Defer code dependent on restoration of previous instance state.
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
Nun ich meine modifizierten code:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
initViews();
setListeners();
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
//Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
shouldDisplayHomeUp();
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
mBackCount++;
shouldDisplayHomeUp();
}
});
}
NavigationDrawerFragment.java
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
((MainActivity) getActivity()).getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().invalidateOptionsMenu(); //calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
//The user manually opened the drawer; store this flag to prevent auto-showing
//the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
if (mDrawerListView != null) {
}
getActivity().invalidateOptionsMenu(); //calls onPrepareOptionsMenu()
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
}
};
//If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
//per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
//Defer code dependent on restoration of previous instance state.
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
Und shouldDisplayHomeUp Funktion:
public void shouldDisplayHomeUp (){
boolean canBack = getFragmentManager().getBackStackEntryCount() > 0;
mNavigationDrawerFragment.getDrawerToggle().setDrawerIndicatorEnabled(!canBack);
}
Aber der zurück-Pfeil wird nicht angezeigt
Ich habe versucht, rufen Sie
getSupportActionBar().setDisplayHomeAsUpEnabled(canBack);
getSupportActionBar().setHomeButtonEnabled(canBack);
Also der zurück-Pfeil appers aber anklicken hat keine Wirkung
Sie möchten, ändern Sie die "zurück" - Pfeil, wenn Sie mehr als ein fragment auf Ihrem backstack?
Ja, und back-navigation anstelle Eröffnung Schublade
mit actionbar-das funktioniert perfekt
Siehe meine Antwort hier stackoverflow.com/a/29292130/746347
Ja, und back-navigation anstelle Eröffnung Schublade
mit actionbar-das funktioniert perfekt
Siehe meine Antwort hier stackoverflow.com/a/29292130/746347
InformationsquelleAutor zagum | 2014-10-31
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der docs:
Dies bedeutet, dass Sie implementieren müssen, um Ihre back-routine auf
onOptionsItemSelected
und überprüfenR.id.home
. Um zu vermeiden, den Aufruf der routine, wenn du auf das hamburger-Menü überprüfencanback
auch aufonOptionsItemSelected
.http://developer.android.com/training/implementing-navigation/ancestral.html#up
BEARBEITEN
Erreichen, was Sie wollen Sie implementieren müssen, um Ihre eigenen Navigations-routine.
Aktivieren Sie die Schaltflächen "backbutton" - Symbol rufen Sie einfach
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
zu deaktivieren, rufen Sie einfachmNavigationDrawerFragment.getActionBarDrawerToggle().syncState();
Ich habe bearbeitet die Antwort
setNavigationOnClickListener nicht fangen, klicken Sie auf Veranstaltungen
Sie haben, um es, nachdem Sie nennen
setup()
Ich habe ein Problem mit AppCompat v7. Ich kann sehen, dass das hamburger-Symbol Prima, aber wenn ich es verstecken, und zu zeigen versuchen, das Haus (bis affordance) es nie zeigt. Gedanken?
InformationsquelleAutor Pedro Oliveira
Habe ich einen Weg gefunden, um die Kontrolle der zurück-Taste und die navigationssteuerung. Er arbeitete mit mir.
Zuerst:
Wichtige Sache, dies ist der Weg, ich Verstecke die hamburger und zeigen Sie die zurück-Taste. Sie müssen diesen code in den Ort, den Sie möchten, zeigen zurück-Taste. Auch ich Schloss die Nav beim zeigen zurück-Taste.
InformationsquelleAutor Son Nguyen Thanh