web-dev-qa-db-fra.com

Afficher la flèche arrière de la barre d'outils

Je migre de ActionBar vers Toolbar dans mon application. Mais je ne sais pas comment afficher et définir un événement clic sur la flèche arrière sur Toolbar comme je l’ai fait sur Actionbar.

enter image description here

Avec ActionBar, j'appelle mActionbar.setDisplayHomeAsUpEnabled(true). Mais il n'y a pas de méthode similaire comme celle-ci.

Quelqu'un a-t-il déjà fait face à cette situation et a-t-il trouvé un moyen de la résoudre?

442
Huy Duong Tu

Si vous utilisez un ActionBarActivity, vous pouvez dire à Android d’utiliser Toolbar comme ActionBar comme suit:

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

Et puis appelle à

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

marchera. Vous pouvez également l'utiliser dans les fragments attachés à ActionBarActivities, vous pouvez l'utiliser comme ceci:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

Si vous n'utilisez pas ActionBarActivities ou si vous souhaitez obtenir la flèche de retour sur un Toolbar qui n'est pas défini comme votre SupportActionBar, vous pouvez utiliser les éléments suivants:

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});

Si vous utilisez Android.support.v7.widget.Toolbar, vous devez ajouter le code suivant à votre AppCompatActivity:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
807
MrEngineer13

Je vois beaucoup de réponses mais voici la mienne qui n’a pas été mentionnée auparavant. Cela fonctionne à partir de l'API 8+.

public class DetailActivity extends AppCompatActivity

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

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

    // add back arrow to toolbar
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == Android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }

    return super.onOptionsItemSelected(item);
}
194
Vasil Valchev

Il y a plusieurs façons d'y parvenir, voici ma préférée:

Disposition:

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    app:navigationIcon="?attr/homeAsUpIndicator" />

Activité:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });
147
Igor Bubelov

vous pouvez utiliser la méthode setNavigationIcon de la barre d'outils. Android Doc

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});
72
Sam

Si vous ne voulez pas créer un Toolbar personnalisé, vous pouvez le faire comme ceci

public class GalleryActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...  
        getSupportActionBar().setTitle("Select Image");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == Android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
}                     

En toi AndroidManifest.xml

<activity
    Android:name=".GalleryActivity"
    Android:theme="@style/Theme.AppCompat.Light">        
</activity>

vous pouvez également mettre cette balise Android:theme="@style/Theme.AppCompat.Light" en <aplication> pour qu'elle s'applique à toutes les activités

enter image description here

19
Phan Van Linh
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed(); // Implemented by activity
        }
    });

Et pour API 21+ Android:navigationIcon

<Android.support.v7.widget.Toolbar
    Android:navigationIcon="@drawable/back_arrow"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"/>
16
Ilya Gazman

J'ai utilisé cette méthode depuis le documentation pour les développeurs Google :

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getActionBar().setDisplayHomeAsUpEnabled(true);
}

Si vous obtenez une exception de pointeur null, cela peut dépendre du thème. Essayez d’utiliser un thème différent dans le manifeste ou utilisez ceci alternativement:

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Ensuite, dans le manifeste, où je définis l'activité parente pour l'activité en cours:

<activity
        Android:name="com.example.myapp.MyCurrentActivity"
        Android:label="@string/title_activity_display_message"
     Android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value="com.example.myapp.MyMainActivity" />
</activity>

J'espère que cela t'aidera!

16
Paolo Anghileri

Si vous étiez en utilisant AppCompatActivity et êtes sur le point de ne pas l’utiliser, parce que vous ne voulez pas obtenir le ActionBar automatique qu’il fournit, car vous souhaitez séparer la Toolbar, en raison de vos besoins en matière de conception de matériau et CoordinatorLayout ou AppBarLayout, tenez compte de ceci:

Vous pouvez toujours utiliser le AppCompatActivity, vous n'avez pas besoin de cesser de l'utiliser simplement pour pouvoir utiliser un <Android.support.v7.widget.Toolbar> dans votre xml. Il suffit de désactiver la barre d’action style comme suit:

Tout d’abord, dérivez un style de l’un des thèmes NoActionBar que vous aimez dans votre styles.xml, j’ai utilisé Theme.AppCompat.Light.NoActionBar comme suit:

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/primary_dark</item>
    ...
    ...
</style>

Dans le manifeste de votre application, choisissez le thème de style enfant que vous venez de définir, comme suit:

    <activity
        Android:name=".activity.YourSuperCoolActivity"
        Android:label="@string/super_cool"
        Android:theme="@style/SuperCoolAppBarActivity">
    </activity>

Dans votre activité XML, si la barre d'outils est définie comme suit:

...
    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        />
...

Ensuite, et c’est la partie importante, vous définissez la barre d’action de prise en charge de AppCompatActivity que vous étendez, de sorte que la barre d’outils de votre xml, devienne la barre d'action. J’estime que c’est un meilleur moyen, car vous pouvez tout simplement effectuer les nombreuses tâches autorisées par ActionBar, telles que les menus, le titre de l’activité automatique, la gestion de la sélection d’éléments, etc. sans recourir à l’ajout de gestionnaires de clics personnalisés, etc.

Dans le remplacement onCreate de votre activité, procédez comme suit:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_super_cool);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);
    //Your toolbar is now an action bar and you can use it like you always do, for example:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 
12
Dhiraj Gupta

Moyen simple et facile d'afficher le bouton de retour dans la barre d'outils

Collez ce code dans la méthode onCreate

 if (getSupportActionBar() != null){

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

Coller cette méthode de remplacement en dehors de la méthode onCreate

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()== Android.R.id.home) {

        finish();
    }
    return super.onOptionsItemSelected(item);
}
7
Waheed Sabir
MyActivity extends AppCompatActivity {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        toolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(arrow -> onBackPressed());
    }
7
Artemiy

Dans le AppCompatActivity par exemple, vous pouvez faire

public class GrandStatActivity extends AppCompatActivity {

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

    @Override
    public void onResume() {
        super.onResume();

        // Display custom title
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setTitle(R.string.fragment_title_grandstats);

        // Display the back arrow
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    // Back arrow click event to go to the parent Activity
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}
5
Developer

Vous pouvez facilement le faire.

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Crédits: https://freakycoder.com/Android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e

5
Euler Tiago

Dans le fichier manifeste de l'activité pour laquelle vous souhaitez ajouter un bouton Précédent, nous utiliserons la propriété Android: parentActivityName

        <activity
        Android:name=".WebActivity"
        Android:screenOrientation="portrait"
        Android:parentActivityName=".MainActivity"
        />

P.S. Cet attribut a été introduit dans l'API niveau 16.

4

Cela a parfaitement fonctionné

public class BackButton extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_box);
        Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar);
        chatbox_toolbar.setTitle("Demo Back Button");
        chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white));
        setSupportActionBar(chatbox_toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Define Back Button Function
            }
        });
    }
}
3
Vikash Sharma

À Kotlin, ce serait

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}
3
gprathour

Ajoutez ceci au xml de l'activité dans le dossier de disposition:

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.AppBarOverlay">
    <Android.support.v7.widget.Toolbar
        Android:id="@+id/prod_toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>

Rendre la barre d’outils cliquable, ajoutez-les à la méthode onCreate:

Toolbar toolbar = (Toolbar) findViewById(R.id.prod_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});
1
Yang

Si vous utilisez DrawerLayout avec ActionBarDrawerToggle , affichez Bouton Précédent au lieu du bouton Menu (et vice-versa), vous devez ajouter ce code dans votre activité:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.application_name, R.string.application_name);
    mDrawerLayout.addDrawerListener(mDrawerToggle);

    mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_32dp);
    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed(); // Or you can perform some other action here when Back button is clicked.
        }
    });
    mDrawerToggle.syncState();
    // ...
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item))
        return true;

    switch (item.getItemId()) {
        case Android.R.id.home:
            onBackPressed();
            return true;
        // ...
    }

    return super.onOptionsItemSelected(item);
}

public void showBackInToolbar(boolean isBack) {
    // Remove next line if you still want to be able to swipe to show drawer menu.
    mDrawerLayout.setDrawerLockMode(isBack ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
    mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
    mDrawerToggle.syncState();
}

Ainsi, lorsque vous devez afficher le bouton Précédent au lieu du bouton Menu , appelez showBackInToolbar (true) , et si vous avez besoin du bouton Menu , appelez showBackInToolbar (false) .

Vous pouvez générer une flèche de retour (ic_arrow_back_white_32dp) ici , recherchez arrow_back dans Clipart section (utilisez par défaut 32dp avec 8dp padding). Il suffit de sélectionner la couleur que vous voulez.

0
Borzh

Vous pouvez toujours ajouter un Relative layout ou un Linear Layout dans votre Toolbar et placer une icône de vue d'image pour le dos ou une icône de fermeture n'importe où dans la barre d'outils, comme vous le souhaitez.

Par exemple, j'ai utilisé la disposition relative dans ma barre d'outils

 <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar_top"
                Android:layout_width="match_parent"
                Android:layout_height="35dp"
                Android:minHeight="?attr/actionBarSize"
                Android:nextFocusDown="@id/netflixVideoGridView"
                app:layout_collapseMode="pin">

                <RelativeLayout
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content">


                    <TextView

                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:text="Myflix"
                        Android:textAllCaps="true"
                        Android:textSize="19sp"
                        Android:textColor="@color/red"
                        Android:textStyle="bold" />


                    <ImageView
                        Android:id="@+id/closeMyFlix"
                        Android:layout_alignParentRight="true"
                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:layout_gravity="center_vertical"
                        app:srcCompat="@drawable/vector_close" />


                </RelativeLayout>

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

Et ça ressemble à ça:

enter image description here

Vous pouvez ajouter un écouteur de clic sur cette vue d'image depuis Activity ou un fragment comme celui-ci.

  closeMyFlix.setOnClickListener({
            Navigator.instance.showFireTV(  activity!!.supportFragmentManager)
        })
0
Hitesh Sahu

Avec Kotlin c'est devenu:

Xml:

<include
Android:id="@+id/tbSignToolbar "
layout="@layout/toolbar_sign_up_in"/>

Dans votre activité: -

setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar 
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
0
wissem miled

Si vous souhaitez obtenir la flèche de retour sur une barre d'outils qui n'est pas définie en tant que votre SupportActionBar:

(kotlin)

val resId = getResIdFromAttribute(toolbar.context, Android.R.attr.homeAsUpIndicator)
toolbarFilter.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
toolbarFilter.setNavigationOnClickListener { fragmentManager?.popBackStack() }

pour obtenir des res d'attributs:

@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
    if (attr == 0) return 0
    val typedValueAttr = TypedValue()
    context.theme.resolveAttribute(attr, typedValueAttr, true)
    return typedValueAttr.resourceId
}
0
John