Eu tenho 2 atividades (A e B) no meu aplicativo Android e uso a intenção de passar da atividade A para a atividade B. O uso da parent_activity está ativado:
<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 PARA CIMA.
Então, depois que chamei a atividade, o BI pode usar o botão UP para voltar à atividade A. O problema é que o aplicativo parece chamar a função onCreate () da atividade A novamente e esse não é o comportamento de que eu preciso. Preciso da atividade A para ter a mesma aparência antes de ligar para a atividade B.
Existe uma maneira de conseguir isso?
desde já, obrigado
EDITAR:
Não escrevi nenhum código para iniciar a atividade B a partir da atividade A. Acho que é gerado automaticamente pelo eclipse.
A classe B se parece com:
@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);
}
android
android-intent
android-activity
parent
ashiaka
fonte
fonte
Respostas:
Você declarou a atividade A com o padrão
launchMode
no manifesto do Android. De acordo com a documentação , isso significa o seguinte:Portanto, o sistema é forçado a recriar a atividade A (ou seja, chamada
onCreate
), mesmo que a pilha de tarefas seja manipulada corretamente.Para corrigir esse problema, você precisa alterar o manifesto, adicionando o seguinte atributo à declaração de atividade A:
Nota: a chamada
finish()
(como sugerida como solução antes) funciona apenas quando você tem certeza absoluta de que a instância da atividade B que você está encerrando vive sobre uma instância da atividade A. Em fluxos de trabalho mais complexos (por exemplo, iniciando a atividade B a partir de uma notificação) pode não ser esse o caso e você deve iniciar corretamente a atividade A de B.fonte
navigateUpFromSameTask(...)
deve ser a adiçãoFLAG_ACTIVITY_CLEAR_TOP
deupIntent
(vianavigateUpTo(...)
que deve resultar em mesmo comportamento (de acordo com este guia ), mas a bandeira não está definido - e, portanto, esta resposta faz sentidoResposta atualizada: Projeto de navegação
Você deve declarar qual atividade é o pai apropriado para cada atividade. Isso permite que o sistema facilite padrões de navegação como Up, porque o sistema pode determinar a atividade pai lógica a partir do arquivo de manifesto.
Portanto, para isso, você deve declarar sua atividade pai na tag Activity with attribute
android:parentActivityName
Gostar,
Com a atividade pai declarada dessa maneira, você pode navegar até o pai apropriado, como abaixo,
Portanto, quando você chama
NavUtils.navigateUpFromSameTask(this);
esse método, ele finaliza a atividade atual e inicia (ou retoma) a atividade pai apropriada. Se a atividade pai de destino estiver na pilha traseira da tarefa, ela será adiantada conforme definido porFLAG_ACTIVITY_CLEAR_TOP
.E para exibir o botão Para Cima, você deve declarar
setDisplayHomeAsUpEnabled():
Resposta antiga: (sem navegação para cima, navegação para trás padrão)
Isso acontece apenas se você estiver iniciando a Atividade A novamente a partir da Atividade B.
Usando
startActivity()
.Em vez disso, na Atividade A, inicie a Atividade B usando
startActivityForResult()
e substituindoonActivtyResult()
na Atividade A.Agora, na Atividade B, basta
finish()
clicar no botão Acima. Então agora você direcionou para a Atividade AonActivityResult()
sem criar a Atividade A novamente ..fonte
NavUtils.navigateUpFromSameTask(this);
escrever na linha de códigofinish()
.finish()
oustartActivityForResult()
na documentação deles sobre Navegação ( developer.android.com/design/patterns/navigation.html )?Eu tinha praticamente a mesma configuração, levando ao mesmo comportamento indesejado. Para mim, isso funcionou: adicionar o seguinte atributo a uma atividade A no
Manifest.xml
meu aplicativo:Veja este artigo para mais explicações.
fonte
Embora seja uma pergunta antiga, aqui está outra (imho a mais limpa e a melhor) solução, pois todas as respostas anteriores não funcionaram para mim desde que eu aprofundei o link da Atividade B a partir de um Widget .
[ https://stackoverflow.com/a/31350642/570168 ]
Mas também veja: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
fonte
Uma maneira melhor de conseguir isso é usando duas coisas: call:
Agora, para que isso funcione, o arquivo de manifesto declara que a atividade A tem uma atividade pai B. A atividade pai não precisa de nada. Na versão 4 e acima, você obterá uma bela seta para trás sem nenhum esforço adicional (isso pode ser feito em versões inferiores e com um pouco de código, vou colocá-lo abaixo). Você pode definir esses dados na guia manifest-> application na GUI (role para baixo até o nome da atividade pai e coloque-o manualmente)
Nó de suporte:
se você deseja oferecer suporte à versão abaixo da versão 4, também precisa incluir metadados. clique com o botão direito do mouse na atividade, adicione-> metadados, nome = android.support.PARENT_ACTIVITY e valor = your.full.activity.name
para obter a boa seta nas versões inferiores também:
observe que você precisará da versão 7 da biblioteca de suporte para que tudo funcione, mas vale a pena!
fonte
O que funcionou para mim foi adicionar:
para
TheRelevantActivity.java
e agora está funcionando como esperadoe sim, não esqueça de adicionar:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
noonCreate()
métodofonte
Eu tentei
android:launchMode="singleTask"
, mas não ajudou. Trabalhou para mim usandoandroid:launchMode="singleInstance"
fonte
Adicionando à resposta de @ LorenCK, altere
para o código abaixo se sua atividade puder ser iniciada a partir de outra atividade e isso puder se tornar parte da tarefa iniciada por outro aplicativo
Isso iniciará uma nova tarefa e iniciará a atividade pai da sua atividade, que você pode definir no manifesto como abaixo da versão mínima do SDK <= 15
Ou usando
parentActivityName
se for> 15fonte
parentActivityName
para SDK> 15 ou então ele vai dar-lhe algumas falhas aleatóriasEu tive um problema semelhante ao usar o Android 5.0 com um nome de atividade pai incorreto
Eu removi o com.example.myfirstapp do nome da atividade pai e ele funcionou corretamente
fonte
Adicione à sua informação de manifesto de atividade com atributo
está funcionando bem para mim
fonte
Na classe Java: -
Em manifesto: -
Isso vai te ajudar
fonte
como uma pressão traseira
fonte
tente isto:
fonte
Indo para o meu manifesto e adicionando
android:launchMode="singleTop"
a atividade fez o truque para mim.Isso resolveu meu problema especificamente porque eu não queria que o Android criasse uma nova instância da atividade anterior depois de pressionar o
Up
botão na barra de ferramentas. Em vez disso, queria usar a instância existente da atividade anterior quando subi na hierarquia de navegação.Referência: android: launchMode
fonte
Experimente esta solução, use NavUtils.navigateUpFromSameTask (this); na atividade filho: https://stackoverflow.com/a/49980835/7308789
fonte