单击后退按钮时调用onrestart/onresume

Jes*_*zen 1 android

晚间,

我正面临一个小问题,我无法修复.我有一个'基础'活动(名称:TestActivity,扩展ActivityGroup),其中包含历史数组列表.每当我要进行一项新活动时,我都会使用以下位来加载新视图.

Intent intent = new Intent(Start.this, CitySelect.class);
View view = TestActivity.group.getLocalActivityManager().startActivity("cityselect", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
TestActivity.group.replaceView(view); 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在调用replaceView方法来"替换"视图.请参阅下面的代码:

public void replaceView(View v)
{
    history.add(v);
    setContentView(v);
}
Run Code Online (Sandbox Code Playgroud)

在每项活动中,我都凌驾于以下onBackPressed:

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

请参阅下面的back方法:

public void back()
{
    if (history.size() > 0)
    {
        history.remove(history.size() - 1);

        if (history.size() > 0)
        {
            View v = history.get(history.size() - 1);
            setContentView(v);
        }

        else
        {
            finish();
        }
    }

    else
    {
        finish();
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在出现了问题:当我在手机上使用后退按钮并且之前的活动到达前台时,在视图(活动)中将不会调用任何内容.当我关注活动生活时,我认为onResume会被调用,但事实并非如此.什么都没发生.

所以问题是:onResume当我按下后退按钮时,如何调用该方法?

Laz*_*abe 5

@Commonsware友好地指出(在我的另一篇文章中)ActivityGroups实际上已被弃用.我们应该转而使用Fragments.

与你相同的问题一直在和我承认的问题争吵.在按下后退按钮后,将焦点返回到ActivityGroup中的视图时,所有常用工具(OnResume,OnRestart)都不起作用.

不幸的是,我仍然需要找到一种方法来伪造 onResume,当按下后退按钮后来自ActivityGroup内部(因为我大量投资于使用ActivityGroups的遗留代码.)我很挣扎.

希望这可以帮助.

- 编辑 -

我找到了一种方法:

不要保留观点的历史记录,而是保留您开始的活动的id的历史记录.您启动的每项活动都有一个与之关联的唯一ID.因此,当您回调()时,检索活动的ID,然后重新开始活动.这将根据您的需要触发您的活动的"onResume()"方法.

以下是我将如何重构您提供的代码:跟随加载新视图的位:

Intent intent = new Intent(Start.this, CitySelect.class);
View view =     TestActivity.group.getLocalActivityManager().startActivity("cityselect", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
TestActivity.group.replaceView(view,"cityselect"); 
Run Code Online (Sandbox Code Playgroud)

替换"replaceView()"方法中的视图:

public void replaceView(View v, String activityId)
{
    history.add(activityId);
    setContentView(v);
}
Run Code Online (Sandbox Code Playgroud)

最后,来自ActivityGroup的back()方法:

public void back()
{
if (history.size() > 0)
{
    history.remove(history.size() - 1);

    if (history.size() > 0)
    {
        //View v = history.get(history.size() - 1);
        //setContentView(v);

       LocalActivityManager manager = getLocalActivityManager();
       String lastId = mIdList.get(history.size()-1);
       Intent lastIntent = manager.getActivity(lastId).getIntent();
       Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
       setContentView(newWindow.getDecorView());

    }

    else
    {
        finish();
    }
}

else
{
    finish();
}
Run Code Online (Sandbox Code Playgroud)

}

希望这有助于多一点:)