我正在使用推荐的Up Navigation方法,我的代码如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent h = new Intent(ShowDetailsActivity.this, MainActivity.class);
h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(h);
return true;
default: return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
这是用例:
问题是在我点击UP之后,MainActivity再次点击其onCreate()方法并失去所有状态而不是从典型的onResume()开始,就像我刚刚从ShowDetailsActivity调用"finish()"一样.为什么?它是如何工作的,这是Android重新创建使用"向上"导航方法导航到的所有活动的预期行为?如果我点击后退按钮,我会得到预期的onResume生命周期.
如果Android"正确"的不存在,这是我的解决方案:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = new Intent(this, MainActivity.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
NavUtils.navigateUpTo(this, upIntent);
finish();
} else {
finish();
}
return true;
default: return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个相对简单的Android应用程序,其中一个Activity显示项目列表,另一个显示所选项目的详细信息.我启动list活动,这是我最重要的活动(FLAG_ACTIVITY_CLEAR_TOP用于清除调用它的登录活动):
Intent intent = new Intent(this, ListInstancesActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)
并且从该活动中我对选择的项目采取行动:
Intent detailIntent = new Intent(this, ShowInstanceActivity.class);
detailIntent.putExtra(ShowInstanceFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
Run Code Online (Sandbox Code Playgroud)
一切正常,如果我使用软键"后退"按钮,那么ListInstancesActivity我会按照我的预期返回.但是,如果我按下操作栏上的后退/上移按钮,它会破坏并重新创建ListInstancesActivity.这很糟糕,因为这样做计算成本相对较高.
如何使操作栏的行为与软键相同,只返回上一个活动而不是销毁它.
应该注意的是,我正在使用动作栏的支持库版本.
我的相关部分AndroidManifest.xml是
<activity
android:name=".agenda.ListInstancesActivity"
android:label="@string/list_instances_activity_title">
</activity>
<activity
android:name=".agenda.ShowInstanceActivity"
android:label="@string/show_instance_activity_title"
android:parentActivityName=".agenda.ListInstancesActivity">
</activity>
Run Code Online (Sandbox Code Playgroud) 我有两个活动
MainActivityDeepLinkActivity我设置了所有内容,NavUtils以便像在这里,这里和这里建议一样进行导航.
我想要实现的是:
DeepLinkActivity深层链接开始MainActivity只要我的应用程序在最近的应用程序中有任何任务,一切都很好.
但是,当我从最近的应用程序中删除我的应用程序时,它的行为如下:
DeepLinkActivity深层链接开始我调试了代码,然后发现,NavUtils.shouldUpRecreateTask()返回false.
upIntent将所有内容设置为正常,就像我的Component设置一样.但是,NavUtils.navigateUpTo()行为就像打电话一样finish().没有日志声明,没有.
任何想法,如何解决?
AndroidManifest.xml中
<activity
android:name=".DeepLinkActivity"
android:parentActivityName="my.package.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="my.package.MainActivity"/>
<intent-filter>
<!-- Some intent filter -->
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
DeepLinkActivity.java
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// create new …Run Code Online (Sandbox Code Playgroud) 源代码可在此处获取:https://github.com/novemberox/NavigationTest此示例的修改版本:http://developer.android.com/training/implementing-navigation/ancestral.html
我有三个活动:
Main Activity 只是申请的主要入口Category Activity 它是详细活动的父级Detail ActivityMain Activity有打开的按钮Category Activity和Detail Activity.
Category Activty只有一个按钮打开Detail Activity.最后Detail Activity,它显示了一些文本,并具有模拟点击ActionBar的向上按钮.
我的"点击"路径是:
这是预期的流程,并且在Jelly Bean(在Galaxy Nexus 4.1.1和模拟器4.2 Google exppack上测试)之前,它在每个Android上运行良好.它甚至可以在ICS上运行.我正在使用支持库和类似NavUtils和TaskStackBuilder的类,就像我在开始时指出的示例一样.
在JB上单击"向上按钮"时,它返回到主活动状态,状态恢复正常.我查看了支持库的源代码,我看到该NavUtils.navigateUpTo方法调用本机JB代码Activity#navigateUpTo.我尝试了两个NavUtils#navigateUpTo()并且NavUtils.navigateUpFromSameTask()具有相同的不满意结果.
你有什么建议要做这个好流程吗?
我的activity(import android.support.v7.widget.Toolbar;)中有一个工具栏,我正在尝试使用其主页按钮提供向上导航.是)我有的:
表现:
<!-- ... -->
<activity android:name=".SettingsActivity"
android:label="@string/settings"
android:parentActivityName=".MainActivity"/>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
view_toolbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp">
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)
activity_settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Toolbar -->
<include
layout="@layout/view_toolbar" />
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
我的onCreate方法:
super.onCreate(bundle)
setContentView(R.layout.activity_settings);
// Set the toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我不应该有一个按钮,我没有.所以我们没事.但是当我试图添加它时,我做不到.
首先我尝试了这个:
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)
没工作.然后,我想这(如图所示这里):
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ToolbarActivity.this, "Up clicked", …Run Code Online (Sandbox Code Playgroud) 这是与主题相关的清单代码:
<activity
android:name="smartHomes.capstone.GeneralAndSecurity"
android:label="@string/title_activity_general_and_security"
android:parentActivityName="smartHomes.capstone.HomePage" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="smartHomes.capstone.HomePage" />
</activity>
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
03-20 21:19:18.227: E/AndroidRuntime(787): FATAL EXCEPTION: main
03-20 21:19:18.227: E/AndroidRuntime(787): java.lang.IllegalArgumentException: Activity GeneralAndSecurity does not have a parent activity name specified. (Did you forget to add the android.support.PARENT_ACTIVITY <meta-data> element in your manifest?)
03-20 21:19:18.227: E/AndroidRuntime(787): at android.support.v4.app.NavUtils.navigateUpFromSameTask(NavUtils.java:177)
03-20 21:19:18.227: E/AndroidRuntime(787): at smartHomes.capstone.GeneralAndSecurity.onOptionsItemSelected(GeneralAndSecurity.java:41)
03-20 21:19:18.227: E/AndroidRuntime(787): at com.actionbarsherlock.app.SherlockActivity.onMenuItemSelected(SherlockActivity.java:208)
Run Code Online (Sandbox Code Playgroud)
我能否知道为什么返回按钮会给我一个错误?
我在MainActivity中有六个选项卡,第二个选项卡有一个listview,当用户按下listview项时,它打开一个新的Activity with Action栏,所以,当用户按下第二个活动的后退按钮时,我想去主活动的上一个选项卡(第二个选项卡),但它加载了第一个选项卡(主页选项卡).
我怎么解决这个问题?
我有一个父Activity,它启动了一个子活动.
在儿童活动中,我做:
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Ride");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)
当我单击Home/Up按钮时,我finish是活动.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我finish还在Child Activity中的另一个地方,在我所拥有的两个地方finish,它都会回到Parent Activity.
我的问题:
我的问题是,我想刷新父活动只有在的情况下一个的finishes.
当我没有从Up按钮完成结束时- Parent Activity中的数据发生了变化,所以 - 当我按Back/Up按钮时,不需要刷新Parent,但当我执行另一个时finish,我想刷新的家长.
我怎么能检测出来?