Flèche de retour sur la barre D'outils

je passe de ActionBar à Toolbar dans ma demande. Mais je ne sais pas comment afficher et définir l'événement de clic sur la flèche de retour sur Toolbar comme je l'ai fait sur Actionbar .

enter image description here

avec ActionBar , j'appelle mActionbar.setDisplayHomeAsUpEnabled(true) . Mais il n'est pas la même méthode de ce genre.

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

349
demandé sur Vadim Kotov 2014-10-30 14:19:02

13 réponses

si vous utilisez un ActionBarActivity alors vous pouvez dire à Android d'utiliser le Toolbar comme le ActionBar comme suit:

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

puis appelle

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

fonctionnera. Vous pouvez également l'utiliser dans les Fragments qui sont 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 voulez obtenir la flèche arrière sur un Toolbar qui n'est pas défini comme votre SupportActionBar , alors vous pouvez utiliser ce qui suit:

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;
}
658
répondu MrEngineer13 2017-05-31 09:06:34

je vois beaucoup de réponses, mais voici la mienne qui n'est pas mentionné avant. Il 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);
}
162
répondu Vasil Valchev 2016-04-14 12:14:33

il y a plusieurs façons d'y parvenir, voici mon préféré:

Modèle:

<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
        }
    });
102
répondu Igor Bubelov 2016-07-12 04:54:42

vous pouvez utiliser la barre d'outils setNavigationIcon méthode. 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();
    }
});
67
répondu Sam 2015-11-22 13:01:46

j'ai utilisé cette méthode de la Google Developer Documentation :

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

si vous obtenez une exception de pointeur nul, cela peut dépendre du thème. Essayez d'utiliser un thème différent dans le manifeste ou utilisez cette alternative:

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

puis dans le manifeste, où je fixe l'activité principale pour l'activité courante:

<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 vous aidera!

15
répondu Paolo Anghileri 2017-03-23 17:00:24

si vous ne voulez pas créer un personnalisé Toolbar , vous pouvez 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 vous AndroidManifest.xml

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

vous pouvez aussi mettre ce android:theme="@style/Theme.AppCompat.Light" à <aplication> étiquette, pour s'appliquer à toutes les activités

enter image description here

13
répondu Phan Van Linh 2018-02-05 00:58:42

si vous étiez en utilisant AppCompatActivity et avez suivi le chemin de ne pas l'utiliser, parce que vous vouliez ne pas obtenir le automatique ActionBar qu'il fournit, parce que vous voulez séparer le Toolbar , en raison de vos besoins de conception de matériaux et CoordinatorLayout ou AppBarLayout , alors, considérez ceci:

Vous pouvez toujours utiliser le AppCompatActivity , vous n'avez pas besoin d'arrêter de l'utiliser de sorte que vous pouvez utiliser un <android.support.v7.widget.Toolbar> dans votre xml. Il suffit d'éteindre la barre d'action style comme suit:

tout d'abord, dériver un style de l'un des thèmes NoActionBar que vous aimez dans votre styles.xml , j'ai utilisé Theme.AppCompat.Light.NoActionBar comme ainsi:

<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 ceci:

    <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 ainsi:

...
    <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 soutien à L'Appcompatibilité que vous étendez, de sorte que la barre d'outils dans votre xml, devient la barre d'action. Je pense que c'est une meilleure façon, parce que vous pouvez simplement faire les nombreuses choses Qu'ActionBar permet, comme les menus, le titre de l'activité automatique, la manipulation de sélection d'article, etc. sans recourir à l'ajout de gestionnaires de clic personnalisés, etc.

dans votre L'activité onCreate remplacer, procédez de la manière suivante:

@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
répondu Dhiraj Gupta 2016-09-03 07:43:47
    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"/>
12
répondu Ilya Gazman 2017-02-16 12:04:35
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());
    }
4
répondu Artemiy 2018-05-14 14:43:14

cela a fonctionné parfaitement

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
répondu Vikash Sharma 2017-01-09 19:31:11

Dans votre fichier de manifeste pour l'activité où vous voulez ajouter un bouton arrière, nous allons utiliser la propriété android:parentActivityName

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

P.S. cet attribut a été introduit au niveau 16 de L'API.

3
répondu Sunny Kumar Aditya 2017-10-08 09:37:39

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;
    }

}
2
répondu Academy of Programmer 2018-03-02 01:58:11

façon Simple et facile de montrer le bouton arrière sur la barre d'outils

coller ce code dans la méthode onCreate

 if (getSupportActionBar() != null){

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

Coller ce remplacer la méthode 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);
}
2
répondu Waheed Sabir 2018-04-15 06:04:15