Como posso voltar a uma atividade paterna corretamente?
tenho 2 actividades (A E B) na minha aplicação android e uso uma intenção de passar da actividade A à actividade B. O uso de parent_activity está activo:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
eu também uso um tema que fornece um botão de UP.
O problema é que a aplicação parece chamar a onCreate () - função da actividade a novamente e este não é o comportamento que eu preciso. Preciso de actividade A para ver. da mesma forma que parecia antes de ligar para a actividade B. Há alguma maneira de conseguir isso?obrigado antecipadamente
editar:
Não escrevi nenhum código para iniciar a actividade B da actividade A. Acho que é autogenerada pelo eclipse.A Classe B parece:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
16 answers
O sistema cria sempre uma nova instância da actividade no alvo tarefa e encaminha a intenção para ela.
Portanto, o sistema é forçado a recriar a actividade A (isto é, chamando onCreate
) Mesmo que a pilha de tarefas seja tratada correctamente.
Para resolver este problema, é necessário alterar o manifesto, adicionando o seguinte atributo da declaração de actividade A:
android:launchMode="singleTop"
Nota: chamada finish()
(como sugerido como solução antes) funciona apenas quando você estiver completamente certo em que a atividade B instância que você está terminando vive em cima de uma instância de atividade A. Em workflows mais complexos (por exemplo, o lançamento de atividade de B a partir de uma notificação) este pode não ser o caso e você tem que iniciar corretamente A atividade A partir de B.
Resposta Actualizada: Up Design De Navegação
Tem de declarar qual a actividade que é o progenitor apropriado para cada actividade. Ao fazê-lo, permite que o sistema para facilitar os padrões de navegação, como Up, porque o sistema pode determinar a atividade lógica pai a partir do arquivo manifesto.
Por isso, para isso, tem de declarar a sua actividade-mãe na actividade das marcas com o atributo
android:parentActivityName
Tipo,
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.app_name.A" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name=".B"
android:label="B"
android:parentActivityName="com.example.app_name.A" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Com a actividade parental declarado desta forma, você pode navegar até o pai apropriado como abaixo,
@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);
}
Por isso, ao ligar para NavUtils.navigateUpFromSameTask(this);
este método, termina a actividade actual e inicia (ou retoma) a actividade-mãe apropriada. Se a actividade-mãe do alvo estiver na pilha de trás da tarefa, ela é antecipada de acordo com a definição de FLAG_ACTIVITY_CLEAR_TOP
.
E para mostrar o botão você tem que declarar setDisplayHomeAsUpEnabled():
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Resposta antiga: (Sem Navegação Up, navegação Back predefinida)
It só pode repetir a actividade A A a partir da actividade B.
Usando startActivity()
.
Em vez disto, a partir da actividade a iniciar a actividade B usando startActivityForResult()
e anular onActivtyResult()
na actividade A.
Manifest.xml
da minha aplicação:
android:launchMode="singleTask"
Ver este artigo para mais explicações.
Embora uma pergunta antiga, aqui está outra (imho a solução mais limpa e melhor) já que todas as respostas anteriores não funcionaram para mim desde que eu actividade de ligação profunda B de um Widget .
public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
Log.v(logTag, "Recreate back stack");
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
}
[https://stackoverflow.com/a/31350642/570168 ]
Mas também ver: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
NavUtils.navigateUpFromSameTask(this);
Agora, para que isto funcione, tens de ter o teu ficheiro manifesto a dizer que a actividade A
tem uma actividade parental B. A actividade parental não precisa de nada. Na versão 4 e acima você vai ter uma bela seta para trás, sem esforço adicional (isso pode ser feito em versões mais baixas, bem como com um pequeno código, eu vou colocá-lo abaixo)
Você poderá definir estes dados na página Manifesto - >aplicação na interface gráfica (descer para a nome da actividade parental, e colocá-lo à mão)
Nó de Suporte:
Se você deseja suportar a versão abaixo da versão 4, você precisa incluir metadados também. clique com o botão direito sobre a atividade, adicionar->meta dados, Nome =android.suportar.PARENT_ACTIVIDADE e valor = your.full.activity.name
Para obter a seta bonita nas versões inferiores também:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Por favor, note que vai precisar da versão 7 da biblioteca de suporte para que tudo isto funcione, mas vale a pena!
android:launchMode="singleInstance"
Adicionando à resposta de @LorenCK, muda
NavUtils.navigateUpFromSameTask(this);
Para o código abaixo se a sua actividade pode ser iniciada a partir de outra actividade e isto pode tornar-se parte da tarefa iniciada por algum outro aplicativo
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
Isto irá iniciar uma nova tarefa e iniciar a actividade-mãe da sua actividade que poderá definir no manifesto, como em baixo da versão SDK do Min
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
Ou utilizar parentActivityName
Se for > 15
O que funcionou para mim foi adicionar:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
finish();
}
A TheRelevantActivity.java
e agora está a funcionar como esperado
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
MétodoonCreate()
Tive um problema semelhante ao usar o android 5.0 com um mau nome de actividade parental
<activity
android:name=".DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
Removi a comunicação.exemplo.o meu primeiro mapa do nome da actividade parental e funcionou correctamente
Adicione à sua lista de actividades informações com o atributo
android:launchMode="singleTask"
Está a funcionar bem para mim
Na classe Java: -
toolbar = (Toolbar) findViewById(R.id.apptool_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Snapdeal");
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Em Manifesto: -
<activity
android:name=".SubActivity"
android:label="@string/title_activity_sub"
android:theme="@style/AppTheme" >
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data>
</activity>
Vai ajudar-te.
Tenta isto:
Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
intent = getIntent();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpTo(this,intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
Como uma prensa traseira
Isto resolveu especificamente o meu problema porque não queria que o Android criasse uma nova instância da actividade anterior depois de carregar no botão Up
na barra de ferramentas - em vez disso, quis usar a instância existente da actividade anterior quando subi a hierarquia de navegação.
Referência: android:launchMode
Tente esta solução use NavUtils.navegar a partir de uma máscara(esta); na actividade infantil: https://stackoverflow.com/a/49980835/7308789
Utilize finish()
em actividade para voltar quando carregar no evento.