如何实现Android ActionBar后退按钮?

Joa*_*vcm 124 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

sur*_*fan 250

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数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>
Run Code Online (Sandbox Code Playgroud)

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


Jar*_*ows 153

确保在Activity中启用了ActionBar Home Button:

Android,API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

ActionBarSherlock和App-Compat,API 7+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

Android,API 11+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


dkn*_*ack 13

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

android:parentActivityName如果按后退按钮,下一步是设置要导航的活动.这也应该在那里完成AndroidManfiest.xml.

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

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

现在你可以触发方法NavUtils.navigateUpFromSameTask(this); 但是如果你没有android:parentActivityName在你指定AndroidManfiest.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

AndroidManifest文件:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>
Run Code Online (Sandbox Code Playgroud)

添加DetailsActivity:

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

这是工作 :]


Mar*_*cas 8

OnCreate方法中添加:

if (getSupportActionBar() != null) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

然后添加这个方法:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

Android注释:

@OptionsItem(android.R.id.home)
void homeSelected() {
    onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

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


Inz*_* IT 6

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

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