我怎样才能正确回到父母的活动?
我在我的android应用程序中有2个活动(A和B),我使用从活动A到活动B的意图。启用了parent_activity的使用:
<activity android:name=".B" android:label="B" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> </activity>
我也使用一个提供UPbutton的主题。
因此,在我调用活动后,BI可以使用UPbutton返回活动A.问题是应用程序似乎再次调用活动A的onCreate()函数,这不是我需要的行为。 我需要活动A,就像之前看到的那样,我称之为活动B.
有没有办法做到这一点?
提前致谢
编辑:
我没有写任何代码来从活动A开始活动B.我认为它是由eclipse自动生成的。
B类看起来像:
@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清单中的标准launchMode
声明了活动A. 根据文件 ,这意味着以下内容:
系统总是在目标任务中创build一个活动的新实例,并将意图发送给它。
因此,即使任务堆栈被正确处理,系统也被迫重新创build活动A(即调用onCreate
)。
要解决此问题,您需要更改清单,将以下属性添加到A活动声明中:
android:launchMode="singleTop"
注意:调用finish()
(正如之前的解决scheme所build议的那样) 仅在您完全确定您正在终止的活动B实例位于活动A的实例之上时才起作用。在更复杂的工作stream中(例如,从一个通知),这可能不是这种情况,你必须从B正确地启动活动A.
更新的答案:向上导航devise
您必须声明哪个活动是每个活动的适当的父项。 这样做可以使系统便于导航模式(如Up),因为系统可以从清单文件中确定逻辑父活动。
所以为此,你必须在标签Activity中声明你的父Activity
android:parentActivityName
喜欢,
<!-- 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>
通过这种方式声明父级活动,您可以导航到如下所示的适当父级,
@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); }
所以当你调用NavUtils.navigateUpFromSameTask(this);
此方法完成当前活动并启动(或恢复)适当的父活动。 如果目标父活动位于任务的后退堆栈中,则按照FLAG_ACTIVITY_CLEAR_TOP
定义前进。
而要显示向上button,你必须声明setDisplayHomeAsUpEnabled():
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
旧答案:(不支持导航,默认后退导航)
只有当你从Activity B重新开始Activity A时才会发生。
使用startActivity()
。
而不是从Activity A开始,使用startActivityForResult()
开始Activity B,并在Activity A中重写onActivtyResult()
。
现在在活动B中,只需在buttonUp上调用finish()
。 所以现在你直接指向Activity A的onActivityResult()
而不用再创buildActivity A了。
我有几乎相同的设置导致相同的不需要的行为。 对我来说,它在我的应用程序的Manifest.xml中的活动A中添加了以下属性:
机器人:launchMode = “singleTask”
有关说明,请参阅http://www.peachpit.com/articles/article.aspx?p=1874864 。
虽然这是一个老问题,但是由于我从Widget中 链接了Activity B ,因此以前的所有答案都不适用于我,所以这里是另一个(最好的,最好的)解决scheme。
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 ]
但是也请参阅: https : //speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
实现这一点的更好的方法是使用两件事:call:
NavUtils.navigateUpFromSameTask(this);
现在,为了这个工作,你需要让清单文件声明活动A有一个父活动B.父活动不需要任何东西。 在版本4和更高版本中,您将获得一个不错的后退箭头(没有额外的努力)(这可以在较低的版本中完成,也可以使用一些代码,下面将介绍)您可以在manifest-> application选项卡中设置这些数据在GUI中(向下滚动到父活动名称,并手工放置)
支持节点:
如果您希望支持版本4以下的版本,则还需要包含元数据。 右键单击活动,添加 – >元数据,名称= android.support.PARENT_ACTIVITY和值= your.full.activity.name
在较低版本中也可以获得漂亮的箭头:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
请注意,您将需要支持库版本7来获得这一切工作,但它是非常值得的!
我有一个类似的问题,使用android 5.0与一个坏的父活动名称
<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>
我从父活动名称中删除了com.example.myfirstapp,它工作正常
我试过android:launchMode="singleTask"
,但没有帮助。 为我使用android:launchMode="singleInstance"
添加到@ LorenCK的答案,改变
NavUtils.navigateUpFromSameTask(this);
到下面的代码如果您的活动可以从其他活动启动,这可以成为一些其他应用程序启动的任务的一部分
Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); }
这将开始一个新的任务,并启动您的活动的父活动,您可以在清单中定义如下面的Min SDK版本<= 15
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" />
或者,如果它> 15,使用parentActivityName
添加到具有属性的活动清单信息
android:launchMode="singleTask"
对我来说效果不错
什么对我有用补充说:
@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(); }
到TheRelevantActivity.java
,现在它按预期工作
是的,不要忘记补充:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
在onCreate()
方法中
尝试这个:
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);
像一个后退button
进入我的清单,并添加android:launchMode="singleTop"
的活动做了我的伎俩。
这特别解决了我的问题,因为我不希望Android在点击工具栏中的“ Up
button之后创build前一个活动的新实例 – 而是想在上导航层次结构时使用先前活动的现有实例。
参考: android:launchMode
在Java类中: –
toolbar = (Toolbar) findViewById(R.id.apptool_bar); setSupportActionBar(toolbar); getSupportActionBar().setTitle("Snapdeal"); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在清单中: –
<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>
它会帮助你
在活动中使用finish()
以便在点击事件中返回。