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?
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.
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);
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();
}
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;
}
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.
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>
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);
}
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.
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.
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
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.
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
.
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.
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()
.
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.
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);
}
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!
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.
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" />
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.
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
Para kotlin:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}