Правильный способ справиться с кнопкой вверх?

Я использую ActionBarSherlock (хотя я не думаю, что это имеет значение).

У меня есть Основная деятельность и О деятельности. Я хочу, чтобы действие About показывало стрелку назад в виде логотипа и выполняло надлежащую анимацию и тому подобное. Я не знаю, как сделать это правильно.

В настоящее время я под onOptionsMenuItemSelected запускать основное действие, когда нажата кнопка "Вверх / Домой", но оно взломано и не работает должным образом. Он воспроизводит неправильную анимацию и плохо справляется с многозадачностью.

Как мне правильно это настроить?

Вот часть моей основной деятельности, которая запускает About:

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

Вот моя О деятельности:

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

7 ответов

Решение

В корне моей проблемы обнаружилось изменение в манифесте, который я сделал некоторое время назад: я добавил эту строку:

android:launchMode="singleInstance"

поэтому моя основная деятельность не будет возобновлена. Меняя это на:

android:launchMode="singleTask"

решил мои проблемы, и я смог удалить все onOptionsItemSelected вещи. Я знал, что что-то не так, что Android должен был справиться с этим лучше, и я был прав. Проверьте манифест:P

Вы также пробовали это (взято с сайта Android здесь):

в манифесте для каждого действия X, которое нужно перейти к основному действию, добавьте это в код:

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

и это к его явному тегу XML:

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

если вам нужно сохранить то же состояние в основной деятельности, используйте этот код:

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

если API равен 16 или выше, вместо метаданных вы можете добавить атрибут parentActivityName с путем к основному действию.

Вы можете обработать кнопку панели действий, используя код или XML.

Проверьте этот код

если вы хотите это программно, добавьте эту строку в метод onCreate()

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

И переопределить этот метод onSupportNavigateUp()

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

ИЛИ Не программно вы можете добавить мета в файл манифеста как

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

Примечание: убедитесь, что Actionbar не является нулевым.

В вашем onCreate(Bundle savedInstanceState), делать

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

Тогда в вашем onOptionsItemSelected(MenuItem item), делать

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

Для тех, кто хочет просто вернуться к предыдущему упражнению, это самое простое решение:

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);
}
      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings2);
    //here is to put the up back button in the Activity
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
// here is the code to handle to go back to the activity which sent you to this current one
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

Убедитесь, что ваш android:minSdkVersion="11", который можно увидеть в файле манифеста, значок APK был включен из APK 11. Я сделал небольшой пример плз, попробуйте ссылку ниже, которая может помочь вам просто импортировать в рабочее пространство

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

Другие вопросы по тегам