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.

GK
fonte

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;
}
ibrahimyilmaz
fonte
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;
    }
ruX
fonte
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.

ssi-anik
fonte
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;
        }
Krunal Shah
fonte
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.

Stephen Bridgett
fonte
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);
 }
Vivek Hande
fonte
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

Leo Droidcoder
fonte
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;
}
Hariharan Kanakaraja
fonte
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();
}
Roshaan Qurban
fonte
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 ...

Jiří
fonte