Android home/up 按钮

本文详细介绍了Android中的'上箭头'导航,即官方称为的up navigation。通过指明父Activity并添加upAction,可以实现向上回溯到父Activity。使用setDisplayHomeEnabled()方法添加up按钮,并在onOptionsItemSelected()中监听。NavUtils.navigateUpFromSameTask()用于结束当前Activity并启动父Activity。根据parent Activity的launch mode,分为singTop和standard两种情况,分别处理回退行为。此外,当Activity允许其他应用打开时,点击up导航应创建新的回退栈,以确保正确导航回自己的app任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能看了标题也不知道我说的是什么?

是!这个!

这里写图片描述

这个按钮 官方称为 up navigation


指明父activity

向上回溯的操作首先你得有一个“上”,这个上,就是指明的 父activity。也就是不管你是从什么地方打开的,你得 回溯动作一定是返回到你的父activity

如何指明呢?

<activity android:name=".ChildActivity"
 ... 
 android:parentActivityName=".ParentActivity"
>           
<!--如果要支持android4.0以下的-->
<meta-data
     android:name = "android.support.PARENT_ACTIVITY"
     android:value = ".ParenetActivty"
/>
</activity>

添加upAction

使用 setDisplayHomeEnabled() 方法,给actionbar添加一个up按钮:

注意:目前androidStudio自动生成的Activity 是 继承 AppCompatActivit 的
而 APPCompatActivity 是 android.support.v7.app 里的

所以:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true); // 这个是一般支持的,使用会报错
    getSupportActionBar.setDisplayHomeAsEnabled(true); // 这个是v7支持的,在目前可以使用
}

使用这个方法添加的up键,要在哪里监听呢?

答案是:onOptionsItemSelected()

代码如下:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // 对于up按钮的响应如下
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

可以看到,这里使用了 NavUtils 类的一个 静态方法 navigateUpFromSameTask

这个静态方法的作用就是 调用时,结束当前的Activity,并且开始对应的父Activity

注意,对应两种不同的 parent Activity 的 launch mode ,也有两种不同的打开方式:

  1. 模式为 singTop 或者 是 intent 包含 FLAG_ACTIVITY_CLEAR_TOP , 那么parent activity 就会提到stack前面,并且 从 onNewIntent() 方法中可以获取 inten
  2. 模式为 standard 或者 是 intent 没有包含上面的flag的,parent Activity会先从栈中pop掉,然后在栈顶用一个新的实例来获取intent

特别要注意的是:如果要使用 navigateUpFromSameTask 如这个方法的名字,首先一定要是同一个task,也就是说,目前的这个task一定要是从你的app中打开的。如果是从其他的app中打开这个Activity,那么Up应该创建一个新的,属于你的app的task, 也就是要求新建一个 new back stack


回退到新的 回退栈 navigate up with a new back stack

解决在不同app打开Activity问题

如果你的这个Activity,是允许别的应用打开的。那么应该实现 onOptionsItemSelected() 方法,使得当点击navigate up的时候,你的app可以创建一个新的 task (对应一个back stack)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        Intent upIntent = NavUtils.getParentActivityIntent(this); // 获取当前Activity的parent Activity
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
            // 判断parentActivity在不在当前的task中,如果不在,那么说明是从别的app打开的当前app
            // 所以就用 TaskStackBuilder 来创建一个新的task
            TaskStackBuilder.create(this)
                    // 添加这个Activity所有的parent到这个task中
                    .addNextIntentWithParentStack(upIntent)
                    // 跳转到最近的parent
                    .startActivities();
        } else {
            // 如果在,说明是同一个app打开的,那么跳转到它的逻辑父Activity就好了
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
    }
    return super.onOptionsItemSelected(item);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值