Proper way to handle action bar up button?

2019-01-10 22:58发布

问题:

I use ActionBarSherlock (although I don't think it matters).

I have a Main activity and an About activity. I want the About activity to show the back-arrow by its logo, and do the proper animation and such. I don't know how to do this properly.

Currently, I have under onOptionsMenuItemSelected to launch the Main activity when the Up/Home button is pressed, but it's hacky and doesn't really work right. It plays the wrong animation, and handles multitasking poorly.

How do I set this up right?

Here's the part in my Main activity that launches the About:

Intent aboutIntent = new Intent(MainActivity.this, About.class);
MainActivity.this.startActivity(aboutIntent);

Here's my About activity:

package com.stevenschoen.test;

import android.content.Intent;
import android.os.Bundle;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.MenuItem;

public class About extends SherlockActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case android.R.id.home:
                // app icon in action bar clicked; go home
                Intent intentHome = new Intent(this, MainActivity.class);
                intentHome.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intentHome);
                return true;

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

回答1:

Have you also tried this (taken from Android website here) :

in the manifest, for each activity X that needs to go to the main activity, add this to the code:

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

and this to its manifest xml tag:

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.activities.MainActivity" />

if you need to still have the same state on the main activity, use this code instead :

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

if the API is 16 or above, you can add an attribute of parentActivityName with the path to the main activity instead of the metadata .



回答2:

Found out the root of my problem was a change in the manifest I made a while ago: I added this line:

android:launchMode="singleInstance"

so my main activity wouldn't be relaunched. Changing it to:

android:launchMode="singleTask"

solved my problems, and I was able to remove all the onOptionsItemSelected stuff. I knew there was something wrong, that Android should have been able to handle this better, and I was right. Check the manifest :P



回答3:

In your onCreate(Bundle savedInstanceState), do

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

Then in your onOptionsItemSelected(MenuItem item), do

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // go to previous screen when app icon in action bar is clicked
            Intent intent = new Intent(this, PreviousActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
    }
    return super.onOptionsItemSelected(item);
}


回答4:

You can Handle Action Bar button by using Code or XML.

Check this code

if you want it programmatically Add this line in onCreate() method

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

And Override this method onSupportNavigateUp()

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

OR Non-programmatically you can add meta to manifest file as

<activity android:name="Current Activity"
        android:parentActivityName="Activity you want to open">
    </activity>

Note: Make sure Actionbar is not null.



回答5:

For who want to just go back in the previous activity, this is the simplest solution:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish(); //this method close current activity and return to previous
            return true;
    }
    return super.onOptionsItemSelected(item);
}


回答6:

make sure your android:minSdkVersion="11" which could be seen in the manifest file, Up icon has been included from APK 11. I have made a small sample plz try the below link which may be help you just import into your work space

http://www.mediafire.com/?hktdvts7yyduwv1