Exibir botão voltar na barra de ação

181

Estou tentando exibir um Back buttonnoAction bar para mover a página anterior / atividade ou à página principal (primeira abertura). E eu não posso fazer isso.

meu código

ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);

o código está em onCreate.

Dany Maor
fonte
19
Use: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Sukitha Udugamasooriya
@SukithaUdugamasooriya Muito obrigado
Sardorbek Rkh

Respostas:

207

Bem, este é simples para mostrar o botão Voltar

actionBar.setDisplayHomeAsUpEnabled(true);

e você pode customizar o evento back em onOptionsItemSelected

case android.R.id.home:
this.finish();
return true;
fhamicode
fonte
Eu adicionei as linhas acima dentro do onOptionsItemSelected (item MenuItem), já que eu já tenho um menu na ação, estou listando os IDs para redirecionar as opções do menu, o ID inicial não funciona quando clicado
Se você tiver um comportamento estranho (como em: você usa o botão voltar (R.id.home) de um fragmento e acaba fechando a atividade), verifique se NÃO tem "android: noHistory" definido nessa atividade, porque se você faz, mesmo voltando de um fragmento para a "visão geral" da atividade o terminará.
Igor
2
Certifique-se de definir a atividade pai no AndroidMenifest.xml para que o botão R.id.home funcione.
Leap Falcão
192

Eu acho que onSupportNavigateUp()é a melhor e mais fácil maneira de fazer isso, verifique as etapas abaixo. O passo 1 é necessário, o passo dois tem alternativa.

Etapa 1, mostrando o botão Voltar: Adicione esta linha no onCreate()método para mostrar o botão Voltar.

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Etapa 2 da implementação do clique duplo : Substitua este método

@Override
public boolean onSupportNavigateUp(){  
    finish();  
    return true;  
}

pronto,
ou Etapa 2 Alternativa: você pode adicionar meta à atividade no arquivo de manifesto como

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="MainActivity" />

Editar: se você não estiver usando AppCompatActivity, então não use supportword, poderá usar

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Obrigado a @atariguy pelo comentário.

Inzimam Tariq IT
fonte
2
Essa solução funciona muito bem quando você precisa enviar dados de volta para a atividade pai ou se deseja preservar os valores do EditText na atividade pai. Tentei onOptionsItemSelectedsoluções, mas não consegui.
Weeix 20/09/16
3
Melhor solução +10.
Satheeshwaran
3
Se você não estiver usando a biblioteca de suporte da Actionbar, modifique da seguinte maneira: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy
1
Fenomenal. +1. Simples. Elegante. Lindo. :)
Rohit Kumar
1
Obrigado pela ajuda. Usando manifesto, não estava funcionando, mas usando o código que está trabalhando
devnath santosh
70

A mágica acontece onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Matthias Robbers
fonte
1
No meu caso, quero adicionar o botão voltar nessa página em que o evento onOptionsItemSelected (Item do MenuItem) não estará lá ... Existe alguma outra solução para isso ??
Vidhi 23/02
1
Você deve adicionar getActionBar().setDisplayHomeAsUpEnabled(true);primeiro o seu onCreateMethod para o botão mostrar de volta
aletede91
1
Eu acho que se você fizer dessa maneira, você não voltará, mesmo que inicie a atividade anterior novamente, tendo agora mais uma instância dela e sempre siga em frente e em frente até que o estouro da pilha aconteça se você continuar por tempo suficiente. Acho que a resposta de Igor está correta, você deve interromper esta atividade com finish () e deixar o framework levá-lo de volta à instância de atividade anterior em execução.
Reijo Korhonen
2
use o this.onBackPressed();método quando o usuário clicar no botão Voltar.
CaptRisky
47

Solução oficial

Adicione esses dois trechos de código à sua SubActivity

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

adicione metadados e parentActivity ao manifesto para oferecer suporte a sdk inferior.

 <application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.SubActivity"
        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.myfirstapp.MainActivity" />
    </activity>
</application>

Consulte aqui: http://developer.android.com/training/implementing-navigation/ancestral.html

piar
fonte
5
Nota: se estiver usando bibliotecas de suporte para compatibilidade com versões anteriores, será necessário usar "getSupportActionBar ()" em vez de "getActionBar ()". Esta é a resposta mais completa e oficial.
Christopher Bull
32

Adicione essas linhas ao onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

e em onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Espero que isso ajude você ..!

Abhishek
fonte
27

Experimente este código, considere apenas se você precisar do botão Voltar.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
Jaime
fonte
17

No seu onCreatemétodo, adicione:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Ao definir na AndroidManifest.xmlatividade pai (a atividade que será chamada assim que o botão Voltar na barra de ação for pressionado):

Na sua <activity>definição no manifesto, adicione a linha:

android:parentActivityName="com.example.activities.MyParentActivity"
Bruno Peres
fonte
Você só precisa inserir o código do manifesto se quiser suportar dispositivos anteriores à 4.0. O primeiro bit de código é uma solução melhor para as bibliotecas atuais.
Louie Bertoncin
8

Sei que estou um pouco atrasado, mas foi possível corrigir esse problema seguindo os documentos diretamente.

Adicione a tag de metadados a AndroidManifest.xml(para que o sistema saiba)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

Em seguida, ative o botão voltar (para cima) no seu MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

E você estará pronto!

Fonte: Documentação do desenvolvedor do Android

Avi Parshan
fonte
6

Sei que as alternativas acima são muitas soluções úteis, mas desta vez li este artigo (atual Android Studio 2.1.2 com sdk 23) algum método acima não funciona.

Abaixo está a minha solução para subatividade é MapsActivity

Primeiro, você precisa adicionar parentActivity em

AndroidManifest.xml

como isso :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

Segundo, garanta que sua subatividade se estenda AppCompatActivity, não FragmentActivity.

Terceiro, substituir onOptionsItemSelected()método

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Espero que isso ajude!

postace
fonte
4

Tente isso, no seu onCreate ()

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

E para o evento de clique,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
Melbourne Lopes
fonte
4

Para conseguir isso, existem simplesmente duas etapas,

Etapa 1: vá para AndroidManifest.xmle adicione este parâmetro na <activity>tag -android:parentActivityName=".home.HomeActivity"

Exemplo:

<activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Etapa 2: ActivityDetailadicione sua actionpágina / atividade anterior

Exemplo:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
Vivek Hande
fonte
4

no método onCreate write-

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

e este é o arquivo xml

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

e no styles.xml, mude para

Theme.AppCompat.Light.NoActionBar

isso é tudo o que precisamos fazer.

PAWAN LAKHOTIA
fonte
4

Isso é simples e funciona muito bem para mim

adicione isso dentro do método onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

adicione este método oncreate () externo

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
Muhaiminur Rahman
fonte
3

No seu onCreate()método, adicione esta linha

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e, na mesma Atividade, adicione este método para manipular o botão, clique em

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        this.finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Khubaib Raza
fonte
2

Eu resolvi dessa maneira

@Override
public boolean  onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}
Ardit Zeza
fonte
1

meu código de trabalho para voltar à tela.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}
Shihab Uddin
fonte
1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}
pruthwiraj.kadam
fonte
1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) {
        case android.R.id.home: 
            onBackPressed();
            return true;
        }

    return super.onOptionsItemSelected(item);
}
akshay shetty
fonte
1

Pode ser tarde demais para responder, mas tenho uma solução mais curta e funcional na minha opinião.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}
ndungujan
fonte
1

Em oncreate (); escreva esta linha->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

em seguida, implemente o método abaixo nessa classe

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
Manthan Patel
fonte
1

Manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>
Sameer Srivastava
fonte
1

Para exibir o botão Voltar da barra de ação no Kotlin, há duas maneiras de implementá-lo

1. usando a Barra de Ação padrão fornecida pelo Android - Sua atividade deve usar um tema que tenha a Barra de Ação - por exemplo: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Crie sua própria barra de ação - desative a barra de ação padrão - por exemplo: Theme.AppCompat.Light.NoActionBar - adicione layout ao seu activity.xml

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • onCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • crie seu próprio botão
<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >

 <item
     android:id="@+id/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • em YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }
Chea Sambath
fonte
0

Adicione o código abaixo na função onCreate:

getSupportActionBar (). setDisplayHomeAsUpEnabled (true);

E substitua: @Override public boolean onOptionsItemSelected (Item do MenuItem) {onBackPressed (); return true; }

user7347514
fonte
0

Na versão atualizada, getActionBar () não funciona!

Em vez disso, você pode fazer isso dessa maneira

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

adicionar botão voltar na barra de título do Android, isso ajuda você em 2020

pankaj maurya
fonte
Suas duas últimas respostas apontam para o mesmo site. Você é associado / afiliado a esse site de alguma forma? Se você é afiliado, deve divulgar essa afiliação na postagem . Se você não divulgar a afiliação, ela será considerada spam. Veja: O que significa "boa" autopromoção? , algumas dicas e conselhos sobre autopromoção . Qual é a definição exata de "spam" para Stack Overflow? e O que faz com que algo seja spam .
Makyen