4
votes

Le bouton Haut du composant de navigation Android ouvre la navigation dans le tiroir

J'essaie d'implémenter une navigation simple à l'aide du composant de navigation avec graphique de navigation et contrôleur de navigation. J'ai ma MainActivity avec une barre d'action avec l'icône de hamburger et le titre de l'application, une navigation dans le tiroir et une zone de contenu.

La zone de contenu est l'endroit où j'affiche différents fragments.

La zone de contenu est d'abord chargée avec mon écran d'accueilFragment contenant 4 boutons (actualités, événements, calendrier, profil) - chacun d'eux charge un fragment dans la zone de contenu de ma MainActivity. Cela fonctionne bien, le seul problème est le suivant: Lorsque j'appuie sur le bouton Actualités et que je passe de mon écran d'accueil à mon NewsFragment , le fragment OK est chargé et le titre de la barre d'actions devient Actualités. L'icône du hamburger est remplacée par l'icône du "bouton Haut", mais lorsque j'appuie dessus, l'application ouvre le tiroir de navigation comme si j'appuyais sur l'icône du hamburger au lieu de me ramener à l'écran d'accueil . p >

Comment puis-je faire monter le bouton Haut et ne pas afficher le panneau de navigation de gauche?

voici mon MainActivity.java:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.mysample.meganews"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha11'
    implementation 'android.arch.navigation:navigation-ui:1.0.0-alpha11'
}


0 commentaires

3 Réponses :


2
votes

Ce problème était dû au mélange de différentes API. Voici le bon code:

activity_main.xml:

import android.os.Bundle;


import com.google.android.material.navigation.NavigationView;

import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.view.MenuItem;
import android.view.ViewParent;

public class MainActivity extends AppCompatActivity
{
    private Toolbar mToolbar;
    private DrawerLayout mDrawer;
    private ActionBarDrawerToggle mToggle;
    private NavigationView mNavigationView;
    private NavController mNavController;

    private MainViewModel mViewModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        mViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

        setupNavigation();
    }

    private void setupNavigation()
    {
        mToolbar = findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        mDrawer = findViewById(R.id.drawerLayout);
        mNavigationView = findViewById(R.id.nav_drawer_view);

        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {

//                // we need this line to handle the navigation
//                boolean handled = NavigationUI.onNavDestinationSelected(menuItem, mNavController);
//                if (handled) {
//                    ViewParent parent = mNavigationView.getParent();
//                    if (parent instanceof DrawerLayout) {
//                        ((DrawerLayout) parent).closeDrawer(mNavigationView);
//                    }
//                }

                return true;
            }
        });

        mNavController = Navigation.findNavController(this, R.id.content);
        NavigationUI.setupActionBarWithNavController(this, mNavController, mDrawer);
        // Tie nav graph to items in nav drawer
        NavigationUI.setupWithNavController(mNavigationView, mNavController);
    }


    @Override
    public boolean onSupportNavigateUp() {
        //return Navigation.findNavController(this, R.id.content).navigateUp();
        //return mNavController.navigateUp()  || super.onSupportNavigateUp();
        return NavigationUI.navigateUp(mNavController, mDrawer);
    }

    @Override
    public void onBackPressed() {
        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
            mDrawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark" />
                <fragment
                    android:id="@+id/content"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    app:layout_behavior="@string/appbar_scrolling_view_behavior"
                    android:name="androidx.navigation.fragment.NavHostFragment"
                    app:navGraph="@navigation/nav_graph"
                    app:defaultNavHost="true"/>

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_drawer_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>


0 commentaires

2
votes

J'ai eu le même problème et je l'ai résolu avec la solution de contournement ci-dessous.

    mToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mActivity.onBackPressed();
        }
    });

Assurez-vous également de définir l'écouteur de clic sur ActionBarDrawerToggle comme ci-dessous.

    mNavController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller,
                                         @NonNull NavDestination destination, @Nullable Bundle arguments) {          
            if (mAppBarConfiguration.getTopLevelDestinations().contains(destination.getId())) {
                mToggle.setDrawerIndicatorEnabled(true);
            } else {
                mToggle.setDrawerIndicatorEnabled(false);
            }
        }
    });


0 commentaires

0
votes

La navigation gère cela par défaut, vous n'avez pas à gérer explicitement l'écouteur pour cela. Dans votre activité, remplacez "onSupportNavigationUp"

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(navController, drawer_layout)
}

et procédez ci-dessus. Il gérera le bouton de retour et l'icône de hamburger par défaut.


0 commentaires