Desativar botão voltar no android

334

Como desativar o botão Voltar no Android durante o logout do aplicativo?

Graça
fonte
1
Você pode ser um pouco mais claro sobre a questão? Se você estiver procurando substituir o comportamento padrão do botão Voltar, consulte esta pergunta aqui. stackoverflow.com/questions/2000102/…
Gopinath
26
Por favor, não faça isso a menos que você tenha uma boa razão, como quebrar o modelo esperado de operação dói muito ligeiramente toda a plataforma
Hamy
14
Você desejaria fazê-lo se tivesse que lidar com um estúpido Samsung S4, em que o botão voltar é sensível ao toque (não físico), na borda do telefone, que já é tão sensível ao toque que uma palma apoiada na lateral volte.
Garlicman
1
É contra o guia Android Quality and Design , função UX-N1.
18750 MiguelSlv #

Respostas:

651

Substitua o método onBackPressed e não faça nada se você pretender manipular o botão Voltar no dispositivo.

@Override
public void onBackPressed() {
   if (shouldAllowBack()) {
       super.onBackPressed();
   } else {
       doSomething();
   }
}
Gopinath
fonte
12
Isso é muito melhor e mais limpo do que substituir os principais métodos de manipulação e tem o mesmo efeito. Ótima resposta!
Nik Kingman
2
Ótima solução, cara. Existe alguma maneira de fazer isso com o botão home?
Datta Kunde
1
Isso é ótimo! Na verdade, eu sempre quis voltar à minha atividade principal ao pressionar para trás de qualquer outra atividade, e substituir esse método me permite fazer isso com muita facilidade.
21713 Jim
Ops, esqueci de remover super.onBackPressed ().
Aristo Michael
173

Se procurar um nível de API 2.0 mais alto e acima, isso funcionará muito bem.

@Override
public void onBackPressed() {
    // Do Here what ever you want do on back press;
}

Se estiver procurando por nível de API Android até 1.6.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {
     //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
     return true;
     }
     return super.onKeyDown(keyCode, event);    
}

Escreva o código acima em sua atividade para evitar que o botão voltar seja pressionado

Javanator
fonte
5
Este método é mais compatível com versões anteriores do que usar onbackpressed devido à exigência de nível api do onbackpressed
AndrewPK
5
Ótima resposta. Embora não precise dele para o meu projeto, compreendo que você forneceu os métodos antigo e novo. Isso deve ser marcado como resposta correta. +1
Jim
1
@Javanator o segundo não iria funcionar para mim (para o nível API 16, por exemplo), mas o primeiro funciona como um encanto
noloman
38

Você pode fazer desta maneira simples Não chame super.onBackPressed ()

Nota: - Não faça isso a menos e até que você tenha motivos fortes para fazê-lo.

@Override
public void onBackPressed() {
// super.onBackPressed();
// Not calling **super**, disables back button in current screen.
}
Iman Marashi
fonte
6
Uma explicação sobre "por que não" seria ótima. Obrigado.
quase um iniciante
Não chamar .super é importante!
Ran
3
@almostabeginner porque não chamar super invalida o uso normal do botão voltar. os usuários surtam quando um botão normalmente funciona para de funcionar. eles podem achar que o aplicativo está com defeito ou que o telefone está com defeito etc., no final, ele será o culpado.
bengongon97
23

Simplesmente substitua o método onBackPressed () .

@Override
public void onBackPressed() { }
Pankaj kumar
fonte
13

Estou usando .............

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK)
        Toast.makeText(getApplicationContext(), "back press",      
     Toast.LENGTH_LONG).show();

    return false;
       // Disable back button..............
}
Mahmudul Haque Khan
fonte
9

Se você deseja garantir que seu aplicativo cliente Android seja desconectado de algum servidor antes que sua Atividade seja interrompida -> efetue logout com um serviço em seu próprio encadeamento (é isso que você deve fazer de qualquer maneira).

Desativar o botão Voltar não resolverá nada para você. Você ainda terá o mesmo problema quando o usuário receber uma ligação, por exemplo. Quando uma chamada telefônica é recebida, sua atividade tem mais chances de ser morta antes de receber uma resposta confiável da rede.

É por isso que você deve deixar um serviço aguardar em sua própria thread a resposta da rede e, em seguida, tentar novamente se não tiver êxito. O serviço Android não só tem muito menos probabilidade de ser morto antes de receber uma resposta, mas também deve ser morto antes de terminar o trabalho, mas sempre pode ser revivido pelo AlarmManager para tentar novamente.

Stephan Branczyk
fonte
8

Basta substituir o método onBackPressed () e não é necessário chamar a super classe do método onBackPressed ou outros.

@Override
public void onBackPressed()
{

}

Ou passe sua atividade atual para o método onBackPressed ().

@Override
public void onBackPressed()
{
   startActivity(new Intent(this, myActivity.class));  
   finish();
}

Substitua o nome da atividade requerida para myActivity.

se você estiver usando fragmento, chame primeiro o método callParentMethod ()

public void callParentMethod(){
    context.onBackPressed(); // instead of context use getActivity or something related
}

então chame o método vazio

@Override
public void onBackPressed()
{

}
Zakaria Hossain
fonte
6

se você estiver usando FragmentActivity. então faça assim

primeira chamada Isto dentro do seu Fragment.

public void callParentMethod(){
    getActivity().onBackPressed();
}

e, em seguida, chame o onBackPressedmétodo ao lado da FragmentActivityclasse pai .

@Override
public void onBackPressed() {
  //super.onBackPressed();
  //create a dialog to ask yes no question whether or not the user wants to exit
  ...
}
cerquilha
fonte
5

Apenas usando este código: Se você deseja desativar a contrapressão, não use super.OnBackPressed ();

@Override
public void onBackPressed() {

}
Seda T.
fonte
4

Se você quiser desativar o aplicativo enquanto estiver desconectado, poderá abrir uma caixa de diálogo não cancelável.

Ted Hopp
fonte
4

Você pode substituir o onBackPressed()método em sua atividade e remover a chamada para superclasse.

@Override
public void onBackPressed() {
  //remove call to the super class
  //super.onBackPressed();
}
Aman Agarwal
fonte
3

Você só precisa substituir o método do botão Voltar. Você pode deixar o método vazio, se desejar, para que nada aconteça ao pressionar o botão Voltar. Por favor, dê uma olhada no código abaixo:

@Override
public void onBackPressed() 
{
   // Your Code Here. Leave empty if you want nothing to happen on back press.
}
Hammad Khan
fonte
3

Além de formar esses dois métodos a partir da resposta acima.

onBackPressed () (nível de API 5, Android 2.0)

onKeyDown () (API nível 1, Android 1.0)

Você também pode substituir o dispatchKeyEvent()(API Nível 1, Android 1.0) assim,

dispatchKeyEvent() (API nível 1, Android 1.0)

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // TODO Auto-generated method stub
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}
Kris Roofe
fonte
3

Desativar botão traseiro no android

@Override
public void onBackPressed() {
    return;
}
Mahesh Bokhani
fonte
2

Para mim, apenas substituir onBackPressed()não funcionou, mas apontar explicitamente qual atividade deveria começar funcionou bem:

@Override
public void onBackPressed(){
  Intent intent = new Intent(this, ActivityYouWanToGoBack.class);
  startActivity(intent);
}
cheeroke
fonte
1

Tente o seguinte:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

   return true;
 }
   return super.onKeyDown(keyCode, event);    
}
mohamad sheikhi
fonte
1

remover super.onBackPressed()do public void onBackPressed()trabalho ótimo. testado no android 9

Golil
fonte