Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确返回到父活动?_Android_Android Intent_Android Activity_Parent - Fatal编程技术网

Android 如何正确返回到父活动?

Android 如何正确返回到父活动?,android,android-intent,android-activity,parent,Android,Android Intent,Android Activity,Parent,我的android应用程序中有两个活动(A和B),我使用一个从活动A到活动B的意图。启用了parent_活动的使用: 我还使用了一个主题,它提供了一个向上按钮 因此,在调用活动B之后,我可以使用向上按钮返回到活动A。问题是应用程序似乎再次调用活动A的onCreate()函数,而这不是我需要的行为。我需要活动A看起来和我称之为活动B之前一样 有没有办法做到这一点 编辑 我没有编写任何代码从活动A启动活动B。我认为它是由Eclipse自动生成的 B类看起来像: @Override pub

我的android应用程序中有两个活动(A和B),我使用一个从活动A到活动B的意图。启用了parent_活动的使用:


我还使用了一个主题,它提供了一个向上按钮

因此,在调用活动B之后,我可以使用向上按钮返回到活动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);
}

更新答案:向上导航设计

您必须声明哪个活动是每个活动的适当父级。这样做允许系统简化导航模式,例如Up,因为系统可以从清单文件确定逻辑父活动

因此,您必须在带有属性的标记活动中声明父活动

android:launchMode="singleTask"
android:parentActivityName

因此,当您调用
NavUtils.navigateUpFromSameTask时(this)
此方法,它完成当前活动并启动(或恢复)相应的父活动。如果目标父活动位于任务的后堆栈中,则会按照
标志\u活动\u清除\u顶部
的定义将其前移

要显示Up按钮,您必须声明
setDisplayHomeAsUpEnabled():

旧答案:(无向上导航,默认向后导航)

只有当您从活动B再次开始活动A时,才会发生这种情况

使用
startActivity()

使用活动A中的
startActivityForResult()
启动活动B,并覆盖活动A中的
onactivityresult()


现在在活动B中,只需在按钮上调用
finish()
。因此,现在您指向活动A的
onActivityResult()
,而没有再次创建活动A。

我有几乎相同的设置,导致了相同的不想要的行为。对我来说,这很有效: 将以下属性添加到我的应用程序的
Manifest.xml
中的活动A中:

android:launchMode="singleTask"

请参阅以获取更多解释。

您在Android清单中使用标准的
启动模式
声明了活动A。根据,这意味着:

系统始终在目标中创建活动的新实例 任务并将意图传递给它

因此,即使任务堆栈处理正确,系统也会被迫重新创建活动A(即调用
onCreate

要解决此问题,您需要更改清单,将以下属性添加到活动声明中:

android:launchMode="singleTop"

注意:调用
finish()
(如前所建议的解决方案)仅在您完全确定要终止的活动B实例位于活动A实例之上时才能工作。在更复杂的工作流中(例如,从通知启动活动B)情况可能并非如此,您必须从B正确启动活动A。

实现这一点的更好方法是使用两种方法: 电话:

现在,为了使其工作,您需要使清单文件状态为活动A 有父活动B。父活动不需要任何东西。在版本4和更高版本中,您将获得一个漂亮的返回箭头,无需额外努力(这可以在较低版本上完成,也可以使用少量代码,我将在下面介绍) 您可以在GUI的manifest->application选项卡中设置此数据(向下滚动到父活动名称,并手动放置)

支持节点:

如果您希望支持低于版本4的版本,则还需要包含元数据。 右键单击活动,添加->元数据,name=android.support.PARENT\u活动,value=your.full.activity.name

要在较低版本中获得漂亮的箭头,请执行以下操作:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
请注意,您将需要支持库版本7,以使这一切工作,但它是非常值得的

试试这个:

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);
}

使用属性将信息添加到活动清单中

android:launchMode="singleTask"

对我来说效果很好

我在使用安卓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”为我工作虽然这是一个老问题,但这里有另一个(最干净和最好的)解决方案,因为之前的所有回答都不适用于我,因为我从一个小部件下载了深度链接活动B

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);
  }
}
[]


但也请参见:

进入我的清单,并将
安卓:launchMode=“singleTop”
添加到活动中,这对我来说是个好办法

这特别解决了我的问题,因为我不想让Android在点击工具栏中的
Up
按钮后创建上一个活动的新实例,而是想在升级导航层次结构时使用上一个活动的现有实例


参考资料:

添加到@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);
}
这将启动一个新任务并启动活动的父活动,您可以在清单中定义该活动,如Java类中的Min SDK版本15的下面所示:-

    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>


这将有助于你

对我有用的是:

    @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();
    }
therelantactivity.java
,现在它正在按预期工作

是的,别忘了加上:

getSupportActionbar.setDisplay
<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />
    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>
    @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();
    }
    @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);