como substituir o botão Voltar da barra de ação no Android?


95

Desejo personalizar o botão Voltar da atividade na barra de ações, não no botão Voltar da tecla de hardware. Eu substituí o onBackPressed()método. Funciona com o botão Voltar do meu emulador, mas não com o botão Voltar da barra de ação.

Eu quero que isso aconteça com a barra de ação. Como posso fazer isso?

Aqui está o meu código:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

Eu usei esta torrada, se pressionada de volta está funcionando ou não, mas a implementação real muda como voltar para a atividade anterior. Mas isso não está funcionando com o botão presente no topo da barra de ação (além do título da atividade).

Por favor, qualquer um poderia me especificar o problema.

Respostas:


209

Acho que você deseja substituir a operação de clique do botão home. Você pode substituir essa funcionalidade desta forma em sua atividade.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

1
Noah Ibrahim, Na verdade, existe o botão Voltar no canto superior esquerdo como o botão Voltar no navegador. Quando clico nesse botão, quero voltar à atividade anterior. Não é como o código que você postou acima.
GK

4
adicione super.onBackPressed (); para ele
redestructa

2
Isso funcionou para mim depois que mudei return true;para return super.onOptionsItemSelected(item). Então, você pode fazer algo acontecer quando o usuário clicar no botão Voltar da barra de ações, mas ainda manter a mesma funcionalidade do botão.
kumaheiyama

Com essa técnica, o botão de seta para trás está respondendo tarde. Significa que tenho que esperar um segundo para o evento ser acionado. Também não aparece o seletor neste botão para o efeito ao pressioná-lo
Gopal Singh Sirvi

Não funcionou para mim. Quando eu depurei, encontrei os ids do botão home e o id do botão clicado diferente.
viper

45

Se você deseja que o botão Voltar da ActionBar se comporte da mesma maneira que o botão Voltar do hardware:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }

1
caso android.R.id.homenão dispara
Trancer

2
@Trancer se você usá-lo no Fragment, você também deve chamar setHasOptionsMenu(true)o método onCreate do fragmento
wilddev

10

Duas coisas devem ser lembradas: o usuário pode pressionar o botão Voltar ou o botão inicial da barra de ações
Então, se você quiser redirecioná-lo para o mesmo destino, você pode fazer isso.

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

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

Isso levará o usuário à intenção de pressionar qualquer tecla ou o botão da barra de ação.


caso android.R.id.homenão dispara
Trancer

@Trancer, já faz quase 1,5+ anos. E eu não faço android agora. Eu não posso te ajudar agora. Desculpe.
ssi-anik

então qual é a solução?
GA1 de

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

2
Você poderia ter adicionado como um comentário. É mais ou menos igual à resposta aceita.
Sufian

7

Desculpe, minha resposta é tardia, mas para qualquer outra pessoa que chegue a esta página com a mesma pergunta, eu tentei o acima:

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

mas não conseguiu pegar o botão "Voltar" pressionado.

Eventualmente, encontrei um método que funcionou para mim em https://stackoverflow.com/a/37185334/3697478 que é substituir o "onSupportNavigateUp ()", pois estou usando a barra de ações da biblioteca de suporte "AppCompatActivity". (Existe um equivalente "onNavigateUp ()" para a biblioteca de barra de ação / barra de ferramentas mais recente.)

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

e removi a seção "android: parentActivityName =". MainActivity "do arquivo de manifesto.


4

Eu consegui isso, usando apenas duas etapas,

Etapa 1: Vá para AndroidManifest.xml e adicione o parâmetro na tag - android: parentActivityName = ". Home.HomeActivity"

exemplo:

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

Etapa 2: em ActivityDetail, adicione sua ação para a pá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);
 }

2

Se quiser retornar à instância anterior de uma Activity pressionando o botão home da ActionBar, sem recriá- la, você pode substituir o método getParentActivityIntent para usar o da pilha de retorno:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

EDIT:
Além disso, você pode obter o mesmo resultado,
definindo o launchMode de sua atividade pai para singleTop.
Portanto, defina android:launchMode="singleTop"como atividade pai em seu manifesto.
Ou você pode usar o sinalizador FLAG_ACTIVITY_CLEAR_TOP com a intenção UP.
referência: Fornecendo navegação para cima


2

(1) Adicionar atividade pai para sua atividade filho (AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2) substituir o método onSupportNavigateUp dentro da atividade filho

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}

0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

Existem várias maneiras de configurar o botão Voltar na barra:

1) método .setDisplayHomeAsUpEnabled(true);fará isso, e então você pode simplesmente substituirandroid.R.id.home

2) adicionar <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />no Android Manifest, mas neste caso você não pode substituir android.R.id.homeem OnOptionsMenuSelected.

.. para aqueles que se perguntam por que não funciona para eles ...

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.