210 votes

Le même tiroir de navigation dans différentes activités

J'ai créé un tiroir de navigation fonctionnel comme celui qui est présenté dans le tutoriel sur le site de l développeur.Android.com site web. Mais maintenant, je veux utiliser un tiroir de navigation, que j'ai créé dans la classe NavigationDrawer.class pour plusieurs activités dans mon application.

Je me demande si quelqu'un ici peut faire un petit tutoriel qui explique comment utiliser un tiroir de navigation pour plusieurs activités.

Je l'ai lu en premier sur ce site. Tiroir de navigation Android sur plusieurs activités

mais cela n'a pas fonctionné sur mon projet

public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {

        public void onDrawerClosed(View view) {
            getActionBar().setTitle(R.string.app_name);
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(R.string.menu);
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    listItems = getResources().getStringArray(R.array.layers_array);
    drawerList = (ListView) findViewById(R.id.left_drawer);
    drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text,
            listItems));

    drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
            drawerClickEvent(pos);
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);

}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    drawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    drawerToggle.onConfigurationChanged(newConfig);
}
}

Dans cette activité, je veux avoir le tiroir de navigation, j'ai donc étendu 'NavigationDrawer' et dans d'autres activités, je veux utiliser le même tiroir de navigation.

  public class SampleActivity extends NavigationDrawer {...}

1 votes

Vous pouvez trouver les exemples aquí .

1 votes

Vous pouvez trouver de : stackoverflow.com/questions/33009469/

5voto

Abhinav Saxena Points 880

Ma suggestion est la suivante : n'utilisez pas du tout d'activités, mais plutôt des fragments, et replacez-les dans le conteneur (Linear Layout par exemple) où vous montrez votre premier fragment.

Le code est disponible dans Android Developer Tutorials, vous devez juste le personnaliser.

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

Il est conseillé d'utiliser de plus en plus de fragments dans votre application, et il ne devrait y avoir que quatre activités de base locales à votre application, que vous mentionnez dans votre AndroidManifest.xml en dehors des activités externes (FacebookActivity par exemple) :

  1. SplashActivity : n'utilise aucun fragment, et utilise le thème FullScreen.

  2. Activité de connexion et d'inscription : Ne nécessite pas du tout de NavigationDrawer, et pas de bouton de retour non plus, donc utilise simplement la barre d'outils normale, mais au moins, 3 ou 4 fragments seront nécessaires. Utilise le thème no-action-bar

  3. HomeActivity ou DashBoard Activity : Utilise le thème de la barre d'action. Ici, vous avez besoin d'un tiroir de navigation, et tous les écrans qui suivent seront des fragments ou des fragments imbriqués, jusqu'à la vue feuille, avec le tiroir partagé. Tous les paramètres, le profil de l'utilisateur, etc. seront ici en tant que fragments, dans cette activité. Les fragments ne seront pas ajoutés à la pile arrière et seront ouverts à partir des éléments de menu du tiroir. Dans le cas de fragments qui nécessitent un bouton retour au lieu du tiroir, il existe un quatrième type d'activité ci-dessous.

  4. Activité sans tiroir. Cette activité a un bouton de retour en haut et les fragments à l'intérieur partageront la même barre d'action. Ces fragments seront ajoutés à la pile arrière, car il y aura un historique de navigation.

[ Pour plus d'informations, voir : https://stackoverflow.com/a/51100507/787399 ]

Happy Coding ! !

0 votes

Il s'agit d'un article plus ancien. Vous pouvez utiliser des fragments pour vous assurer que vous avez toujours la même activité. Vous continuez à remplacer les fragments dans un conteneur qui lui est dédié. Mettez dans la pile arrière lorsque vous avez besoin d'une navigation en arrière, ou ouvrez tous les fragments lorsque vous avez besoin qu'un fragment soit affiché en premier.

0 votes

@Cabuxa.Mapache Veuillez consulter le lien joint à ma réponse pour obtenir une aide supplémentaire. J'ai pris une BaseActivity commune, qui aide à partager l'ActionBar ToolBar et NavigatonDrawer et d'autres composants dans tous les fragments qui lui sont attachés.

1voto

M S Gadag Points 235

Mettez à jour ce code dans l'activité de base. et n'oubliez pas d'inclure drawer_list_header dans votre activité xml.

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

et n'utilisez pas request() dans votre activité. mais le tiroir n'est toujours pas visible en cliquant sur l'image... et en le faisant glisser, il sera visible sans les éléments de la liste. j'ai beaucoup essayé mais sans succès. j'ai besoin de quelques exercices pour cela...

1voto

russellhoff Points 912

Avec la réponse de @Kevin van Mierlo, vous êtes également capable d'implémenter plusieurs tiroirs. Par exemple, le menu par défaut situé sur le côté gauche (démarrage), et un autre menu optionnel, situé sur le côté droit, qui n'est affiché que lorsque des fragments déterminés sont chargés.

J'ai été capable de le faire.

1voto

Volverine Points 75
package xxxxxx;

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.widget.SearchView;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class loginhome extends AppCompatActivity {
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    // Make sure to be using android.support.v7.app.ActionBarDrawerToggle version.
    // The android.support.v4.app.ActionBarDrawerToggle has been deprecated.
    private ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loginhome);

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Initializing NavigationView

        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu

            public boolean onNavigationItemSelected(MenuItem menuItem) {

                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){

                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.nav_first_fragment:
                        Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
                         FirstFragment fragment = new FirstFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                        return true;

                    // For rest of the options we just show a toast on click
                    case R.id.nav_second_fragment:
                        Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
                        SecondFragment fragment2 = new SecondFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction2.replace(R.id.frame,fragment2);
                        fragmentTransaction2.commit();
                        return true;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        return true;

                }
            }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();

    }

utilisez ceci pour votre toolbar.xml

<?xml version="1.0" encoding="utf-8"?>

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"

        >

    </android.support.v7.widget.Toolbar>

utilisez ceci pour l'en-tête de navigation si vous voulez utiliser

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:background="?attr/colorPrimaryDark"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:orientation="vertical"
    android:gravity="bottom">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:id="@+id/navhead"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:textColor="#ffffff"
            android:text="tanya"
            android:textSize="14sp"
            android:textStyle="bold"

            />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="5dp"
            android:text="tanya.com"
            android:textSize="14sp"
            android:textStyle="normal"

            />
    </LinearLayout>
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_below="@+id/imageView"
        android:layout_marginTop="15dp"

        android:src="@drawable/face"
        android:id="@+id/circleView"
        />

</RelativeLayout>

1voto

Pavlus Points 702

Je le fais en Kotlin comme ceci :

open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("BaseAppCompatActivity", "onCreate()")
    App.getComponent().inject(this)
    drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout

    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)

    navigationView = findViewById(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)

    val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)

    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    toggle.isDrawerIndicatorEnabled = true

    val navigationViewHeaderView = navigationView.getHeaderView(0)
    navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
    if(this is T) return closeDrawer()
    val intent = Intent(applicationContext, T::class.java)
    startActivity(intent)
    finish()
    return true
}

private fun closeDrawer(): Boolean {
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    when (id) {
        R.id.action_tasks -> {
            return launch<TasksActivity>()
        }
        R.id.action_contacts -> {
            return launch<ContactActivity>()
        }
        R.id.action_logout -> {
            createExitDialog(loginService, this)
        }
    }
    return false
}
}

Les activités pour tiroir doivent hériter de ce BaseAppCompatActivity appel super.onCreate après que le contenu soit défini (en fait, il peut être déplacé vers une méthode init) et avoir des éléments correspondants pour les ids dans leur mise en page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X