it-swarm-pt.tech

Android - botão Voltar na barra de título

Em muitos aplicativos (Agenda, Drive, Play Store) quando você toca em um botão e insere uma nova atividade, o ícone na barra de título se transforma em um botão de voltar, mas para o aplicativo que estou fazendo, ele não faz isso. Como faço para que esse ícone o leve de volta para a tela anterior?

89
Drew

Existem dois passos simples para criar um botão de retorno na barra de título:

Primeiro, torne o ícone do aplicativo clicável usando o seguinte código na atividade da barra de título na qual você deseja ter um botão de voltar:

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

Depois de ter adicionado o código acima, você verá uma seta para trás à esquerda do ícone do aplicativo.

enter image description here

Em segundo lugar, depois de ter feito o acima, você ainda terá que criar um código que aproveite o evento click. Para fazer isso, esteja ciente de que, quando você realmente clica no ícone do aplicativo, um método onOptionsItemSelected é chamado. Então, para voltar à atividade anterior, adicione esse método à sua atividade e insira o código Intent que retornará à atividade anterior. Por exemplo, digamos que a atividade que você está tentando voltar para é chamada de MyActivity. Para voltar a ele, escreva o método da seguinte maneira:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

É isso aí!

(No Android developers API, ele recomenda mexer com o manifesto e adicionar coisas como Android:parentActivityName. Mas isso não parece funcionar para mim. O acima é mais simples e confiável.)

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

E na sua atividade

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
125
Luke F.

use este código

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

depois disso, escreva este código no método onOptionsItemSelected

  int id = item.getItemId();

     if (id==Android.R.id.home) {
        finish();
    }
53
anupam sharma

Eu finalmente consegui adicionar corretamente de volta o botão para actionbar/barra de ferramentas

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

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

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}
35
Lucy Fair

1.- Adicione a atividade ao AndroidManifest.xml e forneça os metadados:

<activity
    Android:name="com.example.myfirstapp.DisplayMessageActivity"
    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>

2.- Adicione o seguinte código ao método onCreate da atividade:

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

3.- Sobrescreva o onOptionsItemSelected e use o método estático NavUtils.navigateUpFromSameTask () para navegar pela pilha.

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

No entanto, usar navigateUpFromSameTask () é adequado somente quando seu aplicativo é o proprietário da tarefa atual (ou seja, o usuário iniciou essa tarefa a partir do seu aplicativo). Se isso não for verdade e sua atividade tiver sido iniciada em uma tarefa que pertence a um aplicativo diferente, então, a navegação para Cima deverá criar uma nova tarefa que pertence ao seu aplicativo, o que exige que você crie uma nova pilha de backup.

16
spacebiker

Se sua atividade estender a atividade

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Se sua ação estende AppCompatActivity

public class YourActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Nada mais a fazer, Veja Adicionar ação

[OPCIONAL] Para definir explicitamente a atividade pai, modifique seu Manifest.xml assim:

<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.YourActivity "
        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>

Veja Especifique a atividade pai

9
tot

em primeiro lugar na função onCreate adicionar a seguinte linha

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e adicione a seguinte função no código:

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

        return super.onOptionsItemSelected(item);
    }
5
M Anees

A maneira mais simples e melhor prática como o google explica aqui :

1.Adicione um pai para o seu childActivity no AndroidManifest.xml:

<activity 
        Android:name=".ChildActivity"
        Android:parentActivityName=".ParentActivity" >
</activity>

2.Activate o botão de volta em seu childActivity:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Trabalhou para mim, espero que funcione para você também.

5
luke8800gts

Se você estiver usando a nova biblioteca de suporte para o Studio 5.1 inAndroid, poderá usar isso em seu AppCompatActivity

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

felicidades.

4
ralphgabb

Primeiro você precisa escrever este código

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

Então adicione esta linha no manifesto

 <activity Android:name=".MainActivity"
            Android:parentActivityName=".PreviousActivity"></activity>

Acho que vai funcionar

3
Shahriar Ahmad

Se sua atividade estender AppCompatActivity, você precisa substituir o método onSupportNavigateUp() da seguinte forma:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

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

Lide com sua lógica em seu método onBackPressed() e apenas chame esse método em onSupportNavigateUp() para que o botão de retorno no telefone e a seta na barra de ferramentas façam a mesma coisa.

3
Ruzin

Versão leve sem usar ActionBarActivity que ainda tem os mesmos comportamentos aqui:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

Uso: Coloque new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true); em onCreate.

2
Mygod

Você precisa adicionar o código abaixo mencionado no arquivo de manifesto. Procure a atividade na qual você deseja adicionar a funcionalidade de seta para trás. Se você encontrar o então multa ou criar a atividade

<activity Android:name=".SearchActivity">

</activity>

Em seguida, adicione as três linhas de código a seguir entre elas.

<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.raqib.instadate.MainActivity" />

E não se esqueça de adicionar este trecho de código em onCreate (); método de sua atividade particular em que você precisa de seta para trás.

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

Foi assim que resolvi o problema. Obrigado.

1
RaQib

Eu precisava misturar algumas respostas para obter a resposta certa para mim, pois meu aplicativo tem três atividades que podem ser executadas a qualquer momento. Atividade1> Atividade2> Atividade3. Quando eu estava fazendo algo em minha atividade3, o botão Voltar estava fazendo o backup corretamente em Activity2. No entanto, da Activity2, usando finish(), ele estava fazendo o backup para Activity3 e não Activity1. E estou estendendo AppCompatActivity. Então, minha solução foi:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

no AndroidManifest.xml:

<activity Android:name=".activities.Activity2"
           Android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                Android:name="Android.support.PARENT_ACTIVITY"
                Android:value="com.example.appname.activities.Activity1" />
        </activity>

e finalmente, o botão de ação no meu menu (barra de ação):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case Android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

Usando NavUtils.navigateUpFromSameTask(this); funcionou para mim, em vez de finish().

1
Gi Tavares

Se você estiver usando um ActionBar, você vai querer ler esta documentação http://developer.Android.com/reference/Android/app/ActionBar.html#setDisplayHomeAsUpEnabled (boolean)

Então você tem que sobrescrever o método onOptionsItemSelected (MenuItem) e procurar o evento Android.R.id.home para entrar. Então você sabe que o usuário clicou no botão Voltar na barra de ação.

1
Paul Thompson
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==Android.R.id.home)
    finish();
return super.onOptionsItemSelected(item);
}
0
Abhay Agrawal

Você também pode simplesmente colocar onBackPressed() no seu ouvinte onClick. Isso faz com que seu botão aja como os botões padrão "voltar/subir" em Android aplicativos!

0
user3700215

Também pode ser feito sem código especificando uma atividade pai no manifesto do aplicativo Se você quiser um botão de retorno na Atividade B que irá para a Atividade A, basta adicionar a Atividade A como pai da Atividade B no manifesto.

0
aby4reality

As outras respostas não mencionam que você também pode definir isso no XML do seu widget Toolbar:

app:navigationIcon="?attr/homeAsUpIndicator"

Por exemplo:

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />
0
Michael Litvin

Apenas compartilhando algo que me ajudou e pode ser útil para os outros. Embora a maioria das respostas aqui estejam corretas, usando o getActionBar().setDisplayHomeAsUpEnabled(true);, isso não funcionou para mim. O problema que tive foi que eu estava tentando criar uma segunda atividade manualmente, mas há mais detalhes envolvidos.
O que realmente resolveu meu problema foi seguir AndroidTutor de desenvolvedores ( https://developer.Android.com/training/basics/firstapp/starting-activity ) para criando uma segunda atividade usando Android ferramentas próprias do Studio:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
0
ofri cofri

Isso está funcionando para mim .. Suponha que haja duas atividades (Activityone, Activitytwo)

Inside Activitytwo usa este código

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

em Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

Isso deve ser incluído na segunda atividade dentro do arquivo de manifesto

<activity Android:name=".Activitytwo"
        Android:parentActivityName=".Activityone"></activity>

E o resultado seria assim

enter image description here

0
Muhaiminur Rahman

Para kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
0
Raluca Lucaci