Поведение onBackPressed () с ActivityGroups - PullRequest
0 голосов
/ 29 февраля 2012

Быстрый вопрос: у меня есть группа активности. В этой группе деятельности у меня есть деятельность. Если я нажму обратно в то время как в этом упражнении. Метод действия onBackPressed называется - Не группы действий onBackPressed - Почему это так?

РЕДАКТИРОВАТЬ: получил мой ответ, но проблема остается. Ниже следует код и объяснение моей первоначальной проблемы:

Я использую ActivityGroups в TabHost и, как таковой, был вынужден переопределить onBackPressed. Я могу без проблем перемещаться по своему приложению, нажимая обратно на телефоне и нажимая вкладки на моем вкладке. Но я не могу взаимодействовать с интерфейсом после нажатия Назад. Как только я снова нажимаю одну из вкладок на вкладке, я могу взаимодействовать со всем как обычно. Почему это происходит? Нужно ли переопределять onResume?

Соответствующий код

НастройкиActivityGroup:

public class SettingsActivityGroup extends ActivityGroup 
{
// Keep this in a static variable to make it accessible for all the nested activities, lets them manipulate the view
public static SettingsActivityGroup group;

// Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory.
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // Allocate history
    this.history = new ArrayList<View>();

    // Set group
    group = this;             

    // Start root (first) activity
    Intent myIntent = new Intent(this, SettingsActivity.class); // Change to the first activity of your ActivityGroup
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    ReplaceView("SettingsActivity", myIntent);
}

/*
 * Replace the activity with a new activity and add previous one to history
 */
public void ReplaceView(String pId, Intent pIntent)
{
    Window window = getLocalActivityManager().startActivity(pId, pIntent);
    View view = (window != null) ? window.getDecorView() : null;

    // Add the old activity to the history
    history.add(view);

    // Set content view to new activity
    setContentView(view);
}

/*
 * Go back from previous activity or close application if there is no previous activity
 */
public void back()
{
    if(history.size() > 1)
    {
        // Remove previous activity from history
        history.remove(history.size()-1);

        // Go to activity
        View view = history.get(history.size() - 1);
        Activity activity = (Activity) view.getContext();

        // "Hack" used to determine when going back from a previous activity
        // This is not necessary, if you don't need to redraw an activity when going back
        activity.onWindowFocusChanged(true);
        // Set content view to new activity
        setContentView(view);
    }
    else
    {
        // Close the application
        finish();

    }
}
/*
 * Overwrite the back button
 */
@Override
public void onBackPressed() 
{
    // Go one back, if the history is not empty
    // If history is empty, close the application
    SettingsActivityGroup.group.back();

    return;
}
}

Произвольный дочерний элемент SettingsActivityGroup (CallForwardActivity)

public class CallForwardActivity extends ListActivity 
{
....
    @Override
    public void onBackPressed() 
    {
        // Go one back, if the history is not empty
        // If history is empty, close the application
        SettingsActivityGroup.group.back();

        return;
    }

}

1 Ответ

2 голосов
/ 29 февраля 2012

Поскольку я считаю, что вызов onBackPressed () для выбранного в данный момент действия является желаемым поведением.

Стоит также отметить, что ActivityGroup устарела, но я предполагаю, что вы кодируете для <3.0 и не хотите работатьс библиотеками поддержки. </p>

Относительно вашего отредактированного вопроса. Другой вопрос на этом сайте приводит эту статью в качестве хорошего примера ActivityGroup, и я согласен http://ericharlow.blogspot.com/2010/09/experience-multiple-android-activities.html В этом примере просто вызывается finish () для текущегодействие, когда нажата кнопка назад, и позволяет операционной системе перезапустить предыдущее действие, которое проще, чем то, что вы делаете, и, будем надеяться, сработает!Вы также можете просто вызвать getParent () в своих дочерних действиях, чтобы избежать использования этой статической ссылки (мне кажется, что так легче читать мне!).

...