如何实现Android ActionBar后退按钮?

时间:2012-04-11 15:09:58

标签: java android android-3.0-honeycomb

我有一个listview的活动。当用户单击该项目时,项目“viewer”将打开:

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

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

13 个答案:

答案 0 :(得分:239)

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>

http://developer.android.com/design/patterns/navigation.html#up-vs-back

答案 1 :(得分:150)

确保在活动中启用了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);
        }
    }
}

这样你想要的所有活动都可以有背压。

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

答案 2 :(得分:13)

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

如果按后退按钮,下一步是将android:parentActivityName设置为您要导航的活动。这应该在AndroidManfiest.xml中完成。

现在,您可以在&#34;孩子的onCreate方法中启用后退按钮&#34;活性。

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

现在你应该实现后退按钮的逻辑。您只需覆盖&#34; child&#34;中的onOptionsItemSelected方法。活动并检查后退按钮的id是android.R.id.home

现在你可以触发方法NavUtils.navigateUpFromSameTask(this); 但是,如果你没有在android:parentActivityName中指定AndroidManfiest.xml这会导致你的应用崩溃。

有时这就是你想要的,因为它会让你想起你忘记了某些东西&#34;但是如果你想阻止这种情况,你可以使用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()之间有所不同。

这取决于你走的路,但我发现解决方案很有帮助,特别是如果你为所有活动使用基类。

答案 3 :(得分:8)

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

它的工作:]

答案 4 :(得分:7)

Android注释:

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

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

答案 5 :(得分:4)

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

检查此链接中的代码Click here for complete code

答案 6 :(得分:3)

official py.test documentation

要实现这一目标,只需两个步骤,

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

答案 7 :(得分:1)

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

onCreated方法中用于新的api。

答案 8 :(得分:1)

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

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

然后添加此方法:

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

答案 9 :(得分: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);

答案 10 :(得分:0)

以下步骤足以支持按钮:

第1步: 此代码应位于Manifest.xml

operator<<

第2步: 你不会给予

<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>
启动子活动时在您的父活动中

第3步: 如果您需要从Child Activity返回Parent Activity,那么您只需为Child Activity提供此代码。

finish();

答案 11 :(得分: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);
}

答案 12 :(得分: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 的调用。