145

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

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

这工作正常,但在操作栏上,应用程序图标旁边的后退箭头没有被激活。我错过了什么吗?

4

14 回答 14

277

塞尔文已经发布了正确的答案。在这里,漂亮的代码中的解决方案:

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>

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

于 2012-11-20T10:43:33.290 回答
181

确保在 Activity 中启用了 ActionBar 主页按钮:

安卓,API 5+:

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

ActionBarSherlock 和 App-Compat,API 7+:

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

安卓,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);
        }
    }
}

这样,您想要的所有活动都可以得到支持。

安卓,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);
    }
}
于 2012-07-29T14:43:48.720 回答
19

要启用 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); 如果您没有android:parentActivityName在您中指定,AndroidManifest.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()

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

于 2014-08-03T02:34:31.627 回答
11

AndroidManifest 文件:

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

添加详细信息活动:

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

这是工作 :]

于 2015-04-17T07:30:59.823 回答
11

OnCreate方法中添加:

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

然后添加这个方法:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
于 2019-03-02T21:54:26.547 回答
7

安卓注解:

@OptionsItem(android.R.id.home)
void homeSelected() {
    onBackPressed();
}

来源:https ://github.com/excilys/androidannotations

于 2014-07-22T07:47:18.810 回答
6

我认为这onSupportNavigateUp()是最简单和最好的方法

在下面的 stackoverflow 答案中查看完整的解决方案。链接:点此查看完整代码

于 2016-05-12T11:21:25.380 回答
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);}
}
于 2017-10-24T06:53:35.927 回答
1

以下步骤足以返回按钮:

第 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));
于 2018-04-10T07:26:53.053 回答
1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

onCreated新 API 的方法中。

于 2019-01-08T18:48:21.017 回答
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);
于 2019-07-13T03:04:58.270 回答
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);
}
于 2020-01-06T04:32:19.487 回答
0

我自己也在尝试,一件事对我有用:


        when(item.itemId) {
            R.id.action_signup -> signup() //other menu item
            android.R.id.home -> viewRoot.findNavController().navigateUp() //back 
        }

        return super.onOptionsItemSelected(item)
    }

我正在使用 Jetpack 导航,因此这是获取 NavController 的调用。

于 2021-05-11T04:56:38.173 回答
0

另一种选择是将辅助活动的 parentActivityName 设置为应用程序清单文件中的 MainActifity

<activity
        android:name=".ServiceViewActivity"
        android:parentActivityName=".MainActivity"/>
于 2021-09-04T15:11:18.190 回答