web-dev-qa-db-fra.com

L'icône de navigation de la barre d'outils n'est jamais définie

J'essaie le nouveau composant Barre d'outils et je rencontre des problèmes avec l'icône de navigation .. Je souhaite implémenter une icône personnalisée pour la navigation arrière: 

Dans mon manifeste, j'ai défini un parent pour mon activité: 

<activity Android:name=".CardsActivity" Android:parentActivityName=".MainActivity">
    <!-- Parent activity meta-data to support API level 7+ -->
    <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value=".MainActivity" />
</activity>

Je déclare la barre d'outils comme ceci: 

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.lollitest.MainActivity" >

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/my_awesome_toolbar"
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        Android:minHeight="?attr/actionBarSize"
        Android:layout_marginBottom="10dp"
        Android:background="?attr/colorPrimary" />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/my_awesome_toolbar"
        Android:text="@string/hello_world" />

</RelativeLayout>

Ensuite, dans mon activité, je configure la barre d’outils comme ceci: 

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
toolbar.setNavigationIcon(R.drawable.ic_good);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);
setSupportActionBar(toolbar);

Ce qui me donne: Toolbar with back button

L'icône de retour n'est pas celle que j'ai définie avec setNavigationIcon()! Quel que soit ce que je peux donner à la méthode, l’icône de navigation est toujours la flèche de retour.

J'ai essayé de supprimer l'association de parents dans le manifeste, mais le seul effet est (évidemment) d'empêcher le bouton de revenir en arrière.

Au contraire, si je veux l’icône de flèche arrière par défaut et n’appelle pas setNavigationIcon(), je n’ai aucune icône.

Quelle est la bonne façon de gérer l'icône de navigation dans la barre d'outils (personnalisée et par défaut)?

NOTE: j'exécute mon test sur Android 4.4

63
grunk

Actuellement, vous pouvez l'utiliser, en changeant l'ordre: (cela semble être un bug)

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);

toolbar.setNavigationIcon(R.drawable.ic_good);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);
113
Gabriele Mariotti

Spécifique à l’icône de navigation, c’est le bon ordre

// get the actionbar as Toolbar and set it up
Toolbar toolbar = (Toolbar) findViewById(R.id.signIn_toolbar);
setSupportActionBar(toolbar);

Informer la barre d'outils pour fournir une navigation arrière. Cela définira l'icône sur l'icône de matériau par défaut

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Plus tard, remplacez l'icône par l'icône personnalisée, dans mon cas, l'icône de retour Holo

toolbar.setNavigationIcon(R.drawable.ic_chevron_left_white_36dp);
23
Raffaeu

(La réponse à user802421)

private void setToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null) {
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_action_back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }
}

toolbar.xml

<Android.support.v7.widget.Toolbar
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="@dimen/toolbar_height"
    Android:background="?attr/colorPrimaryDark" />
20
Alexey

Je viens de trouver la solution. C'est vraiment très simple:

mDrawerToggle.setDrawerIndicatorEnabled(false);

J'espère que cela vous aidera.

4
xiaohu Wang

Utilisez setNavigationIcon pour le changer. N'oubliez pas de créer d'abord ActionBarDrawerToggle! 

exemple de code travail pour moi: 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    drawer = (DrawerLayout)findViewById(R.id.drawer_layout);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);

    toggle.syncState();

    toolbar.setNavigationIcon(R.drawable.ic_menu);
4
Nguyên Phạm

J'ai essayé de configurer une barre d'outils comme @Gabriele Mariotti, mais j'avais un problème avec le titre. Alors j'ai mis de l'ordre à

toolbar.setTitle("Title")
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_good);

et il fonctionne.

3
Valentin Blokhin

Vous pouvez utiliser la méthode invalidate() pour modifier l’état de la barre d’outils n’importe où .. .. Exemple:

Toolbar toolbar = (Toolbar)findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);

toolbar.setNavigationIcon(R.mipmap.arrow_white);
toolbar.invalidate();       // restore toolbar
3
Ovechkin Pavel

J'ai utilisé la méthode ci-dessous qui est vraiment un casse-tête de tous les précédents J'ai aussi constaté que onOptionsItemSelected n'est jamais activé.

    mDrawerToggle.setDrawerIndicatorEnabled(false);
    getSupportActionBar().setHomeButtonEnabled(true);

    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
    if (toolbar != null) {
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }
3
Lettings Mall

Supprimer cette ligne de l'activité si vous avez ajouté

 @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

Puis mettre l'icône 

 getSupportActionBar().setHomeAsUpIndicator(icon);
2
Nidhin

Si vous ne souhaitez pas définir la barre d’outils comme barre d’action, vous pouvez utiliser ceci:

        val toggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        toggle.isDrawerSlideAnimationEnabled = false
        toggle.isDrawerIndicatorEnabled = false
        toggle.setHomeAsUpIndicator(AppCompatResources.getDrawable(this, ...))
        drawer!!.addDrawerListener(toggle)
        toggle.setToolbarNavigationClickListener {
            setDrawerOpened(!isDrawerOpened())
        }
        toggle.syncState()

fun setDrawerOpened(open: Boolean) {
    if (open == drawerLayout.isDrawerOpen(GravityCompat.START))
        return
    if (open)
        drawerLayout.openDrawer(GravityCompat.START)
    else drawerLayout.closeDrawer(GravityCompat.START)
}
0
android developer

travaille pour moi...

<Android.support.v7.widget.Toolbar
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/toolBar"
        Android:background="@color/colorGreen"
        app:title="Title"
        app:titleTextColor="@color/colorBlack"
        app:navigationIcon="@drawable/ic_action_back"/>
0
Thialyson Martins

Essaye ça: 

  <Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:toolbar="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/tool_drawer"
        Android:layout_width="match_parent"
        Android:layout_height="?actionBarSize"
        toolbar:navigationIcon="@drawable/ic_navigation">

    </Android.support.v7.widget.Toolbar>
0