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.


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;

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.


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

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


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ê ..!


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

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"

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


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!


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

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

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.


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

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

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

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

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

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

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

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

1

Manifest.xml

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

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

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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.