如何实现Android ActionBar后退按钮?


137

我有一个带有列表视图的活动。当用户单击项目时,将打开项目“查看器”:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

效果很好,但是在操作栏上,未激活应用程序图标旁边的向后箭头。我想念什么吗?


64
getActionBar().setDisplayHomeAsUpEnabled(true);在的onCreate和 switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}onOptionsItemSelected?都在ServicesViewActivity中
Selvin 2012年

7
为什么不作为答案搁置?
KarlKarlsom 2012年

Answers:


263

Selvin已经发布了正确答案。在这里,用漂亮的代码解决方案:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

该函数NavUtils.navigateUpFromSameTask(this)要求您在AndroidManifest.xml文件中定义父活动

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

请参阅此处以进一步阅读。


1
在我的情况下,我一直在寻找一种在返回父级时不调用其父级的onCreate方法。为此,我使用了您的实现,但调用了finish()而不是NavUtils.navigateUpFromSameTask(this)。finish()调用我的onStart而不是onCreate,这对我来说更理想。
2016年

清单中设置的元数据是关键,使导航按钮的工作
VSB

使用getActionBar().setDisplayHomeAsUpEnabled(true);柜面你正在使用支持库。
Abhinav Upadhyay

您如何改变“擦拭”的方向?默认情况下,实施此向后导航会从右向左扫动屏幕,看起来好像正在加载新屏幕。但是,我希望它从左向右擦除,就像按下设备自己的后退键一样。
stingray_

我收到错误:原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)'
Jones

165

确保在“活动”中启用了ActionBar主页按钮:

Android,API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

ActionBarSherlock和App-Compat,API 7+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android,API 11+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

MainActivity扩展示例ActionBarActivity

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

这样,您想要的所有活动都可以使用backpress。

Android,API 16+:

http://developer.android.com/training/implementing-navigation/ancestral.html

AndroidManifest.xml

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

MainActivity扩展示例ActionBarActivity

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

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

当我更改getSupportActionBar()。setDisplayHomeAsUpEnabled(true)时,它对我有用。进入getActionBar()。setDisplayHomeAsUpEnabled(true); 并将这些@SuppressLint(“ NewApi”)在ref内外的onCreate方法中添加:=> developer.android.com/training/implementing-navigation/…–
gnganpath

1
@ganpath小心,使用getActionBar是针对API 11+的
Jared Burrows 2015年

17

要启用ActionBar后退按钮,您显然需要在Activity中使用ActionBar。这由您使用的主题设置。您可以在中为“活动”设置主题AndroidManfiest.xml。如果您使用例如@android:style/Theme.NoTitleBar主题,则没有ActionBar。在这种情况下,对的调用getActionBar()将返回null。因此,请确保首先具有ActionBar。

下一步是将设置为android:parentActivityName要按下导航按钮的活动。这也应该这样做AndroidManifest.xml

现在,您可以在onCreate“子”活动的方法中启用“后退”按钮。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

现在,您应该实现后退按钮的逻辑。您只需onOptionsItemSelected在“子”活动中覆盖该方法,然后检查后退按钮的ID为android.R.id.home

现在,如果您未指定,则可以触发方法NavUtils.navigateUpFromSameTask(this); BUTandroid:parentActivityNameAndroidManifest.xml这会使您的应用程序崩溃。

有时候这就是您想要的,因为它提醒您您忘记了“某物”。因此,如果您想避免这种情况,可以使用getParentActivityIntent()方法检查您的活动是否有父母。如果返回null,则说明您尚未指定父项。

在这种情况下,您可以触发与onBackPressed()用户按设备上的后退按钮基本相同的方法。一个永远不会崩溃您的应用程序的良好实现是:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

请注意,NavUtils.navigateUpFromSameTask(this);和之间用户看到的动画是不同的onBackPressed()

取决于您走哪条路,但是我发现该解决方案很有帮助,尤其是如果您对所有活动都使用基类。


10

AndroidManifest文件:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

添加DetailsActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

是工作 :]


看来这对我来说是最简单的方法。谢谢
TuanDPH



3

https://stackoverflow.com/a/46903870/4489222

为此,只需完成两个步骤,

步骤1:转到AndroidManifest.xml并在标记中添加参数-android:parentActivityName =“。home.HomeActivity”

例如:

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

步骤2:在ActivityDetail中,为上一页/活动添加操作

例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
      case android.R.id.home: 
          onBackPressed();
          return true;
   }
   return super.onOptionsItemSelected(item);}
}

3

在OnCreate方法中添加以下内容:

if (getSupportActionBar() != null)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

然后添加此方法:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}


1

如果您使用的是工具栏,那么我将面临同样的问题。我按照以下两个步骤解决了

  1. 在AndroidManifest.xml中
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. 在SecondActivity中,添加这些...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

只需执行以下步骤即可返回按钮:

步骤1: 此代码应在Manifest.xml中

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

步骤2: 您不会给

finish();

在开始子活动时在您的父活动中。

步骤3: 如果您需要从“子活动”返回“父活动”,则只需为“子活动”提供此代码。

startActivity(new Intent(ParentActivity.this, ChildActivity.class));

0

基于Jared的答案,我必须在多个活动中启用并实现操作栏后退按钮行为,并创建了此帮助器类以减少代码重复。

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

活动中的用法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    ActionBarHelper.enableBackButton(this);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.