Android操作栏主页按钮

Android操作栏主页按钮,android,android-actionbar,Android,Android Actionbar,我已经像这样设置了我的操作栏,但是当我单击home up按钮时,什么也没有发生。 下面的两个选项已启用,因此它不应该自动转到“主页”活动吗 ab.setHomeButtonEnabled(true); ab.setDisplayHomeAsUpEnabled(true); 操作栏 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater();

我已经像这样设置了我的操作栏,但是当我单击home up按钮时,什么也没有发生。 下面的两个选项已启用,因此它不应该自动转到“主页”活动吗

ab.setHomeButtonEnabled(true);
ab.setDisplayHomeAsUpEnabled(true);
操作栏

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    final String[] activities;
    Resources res = getResources();
    activities =  res.getStringArray(R.array.activities);

    ActionBar ab = getActionBar();
    ab.setHomeButtonEnabled(true);
    ab.setDisplayHomeAsUpEnabled(true);
    ab.setTitle(R.string.app_name);
    ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    ab.show();

    /** Create an array adapter to populate dropdownlist */
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_dropdown_item, activities);

    /** Setting dropdown items and item navigation listener for the actionbar */
    getActionBar().setListNavigationCallbacks(adapter, navigationListener);

    /** Enabling dropdown list navigation for the action bar */
    getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    return true;
}
@覆盖
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单,菜单);
最终字符串[]活动;
Resources res=getResources();
activities=res.getStringArray(R.array.activities);
ActionBar ab=getActionBar();
ab.setHomeButtonEnabled(真);
ab.setDisplayHomeAsUpEnabled(真);
ab.setTitle(R.string.app_name);
ab.setNavigationMode(操作栏.导航模式列表);
ab.show();
/**创建阵列适配器以填充dropdownlist*/
ArrayAdapter=新的ArrayAdapter(getBaseContext(),android.R.layout.simple\u微调器\u下拉菜单\u项,活动);
/**为actionbar设置下拉项和项导航侦听器*/
getActionBar().setListNavigationCallbacks(适配器、navigationListener);
/**为操作栏启用下拉列表导航*/
getActionBar().setNavigationMode(ActionBar.NAVIGATION\u MODE\u列表);
返回true;
}

您需要定义此处发生的情况:

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

在代码中添加以下行:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:
        System.out.println("Pressed Back Button");
        break;

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

你还需要确保你的应用程序知道按下时该做什么:

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
    case android.R.id.home:
      // ProjectsActivity is my 'home' activity
      super. onBackPressed();
      return true;
    }
  return (super.onOptionsItemSelected(menuItem));
}

正如其他人所说,这种行为并不是自动发生的——你需要告诉它去哪里

然而,我需要添加另一个答案,因为当前的答案都违反了Android设计准则-后退!=家。看

你真正想做的事情大致如下:

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case android.R.id.home:
            Intent homeIntent = new Intent(this, HomeActivity.class);
            homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(homeIntent);
    }
    return (super.onOptionsItemSelected(menuItem));
}

这将带您进入父活动,而不仅仅是浏览后台堆栈。我还添加了
Intent.Flag
以清除后台堆栈,这是一个在家庭活动中使用的有用的标记,可以防止用户在使用“Up”按钮时后台堆栈陷入混乱

我们必须在AndroidManifast.xml文件中定义元数据,如官方所示:


您可以使用以下一种方法实现这一点,尽管有很多方法可以实现

将这一行放在您的
onCreate

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在您的活动中覆盖支持NavigateUp的方法

@Override
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}

非常感谢,这是我一直在寻找的,我假设当设置为true时,它将返回到主类!我无法计算客户端坚持home按钮作为back功能的次数,因为它需要与应用程序的iOS版本的流程保持一致……这不是真的,通常是back!=回家!在完全相同的链接文档中,它说:导航到具有多个入口点的屏幕:有时一个屏幕在应用程序的层次结构中没有严格的位置,可以从多个入口点访问,例如可以从应用程序中的任何其他屏幕访问的设置屏幕。在这种情况下,向上按钮应选择返回参考屏幕,其行为与向后相同。我相信这可能是一个相当普遍的情况…@直到我不同意。导航到具有多个入口点的屏幕作为一个单独的项目列出,这一事实表明这是一种特殊情况,而不是一般行为。因此,重写
onBackPressed
应该是例外(是的,偶尔有效),而不是规则-但所有其他答案都将此视为常见的解决方案,因此我在回答中强调了这一点。如果一个应用程序的屏幕在层次结构中没有一个严格的位置,那么它就很难导航了。如果这种情况经常发生在你的应用程序中,我建议重新设计你的UI流。@我想说的是,我认为一个应用程序在某些活动(例如,可以从提到用户的任何活动中打开的用户配置文件)中需要有UI流是一种常见的情况。不过,这在应用程序中是个例外,因为我同意,大多数导航步骤都需要遵循严格的路径。但我的观点仍然是,这并非总是违反Android设计准则。你的回答表明,无论是谁在实现这样的事情(即使只是应用程序中的一个案例),都是在做错误的事情,这不一定是真的。检查此链接中的代码会有所帮助。在android活动的上下文中,这个特殊的id
android.R.id.home
是什么?
@Override
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}