导航回到上一个活动

时间:2019-01-01 14:26:47

标签: android

我有两个活动AB

活动A有一个Tablayout和一些Tabs。当我从A导航到B时,我会使用以下代码:

Intent intent = new Intent(A, B.class);
A.startActivity(intent);

现在我从B返回到A时,我有一个问题:

1)使用Android的后退按钮时,系统会记住A中选定的标签页/滚动位置

2)使用Intent或NavUtils.navigateUpFromSameTask(this);时,所选选项卡和滚动位置不会被记住,而是设置为初始值

有人可以告诉我这里发生了什么吗?

4 个答案:

答案 0 :(得分:2)

1)从活动A导航到活动B时,Android系统不会破坏活动A,而是将活动A移至后堆栈并将B添加至前景。这就是为什么当您按下后退按钮或从Java代码活动B调用onBackPressed()时,B被销毁而A被设置为前台的原因。这是文档中的示例:Understand Tasks and Back stack Android Activity Stack

2)在使用intent / navigateUpFromSameTask时,将重新创建活动A并将其设置为前景,将B设置为背景,这就像将另一个活动A添加到堆栈中,因此它将是A,B,A,但是如果按回到btn,然后您将回到B,然后回到A。

如果要将滚动位置和其他数据保留在活动A中,请在B中调用onBackPressed或使用onSaveInstanceState保存数据并在onCreate中使用它。

这是一个已保存实例的示例:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString("VariableName", variableData);
    savedInstanceState.putString("VariableName", variableData);
    savedInstanceState.putString("VariableName", variableData);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.penguin_main);

    if(savedInstanceState!=null){
    bookData = (String) savedInstanceState.getSerializable("VariableName");
    bookData =  (String) savedInstanceState.getSerializable("VariableName");
    bookData =  (String) savedInstanceState.getSerializable("VariableName");
    }
}

答案 1 :(得分:1)

您可以在覆盖onSaveInstance(Bundle savedInstanceState)方法的活动A中设置当前滚动位置和标签位置。恢复活动后,您可以获得onRestoreInstanceState(Bundle savedInstanceState)进行恢复。 希望对您有所帮助:)

答案 2 :(得分:1)

因为NavUtils.navigateUpFromSameTask()只是调用startActivity(),如果android:launchMode =“ standard”,该活动将被实例化并再次创建,这就是为什么不记得以前选择的选项卡的原因。要解决此问题,您可以覆盖onNavigateUp()并在该setCurrentItem(index)内覆盖要显示的标签的索引。

 @Override
 public boolean onNavigateUp() {

  myViewPager.setCurrentItem(position, true);
  return true;
} 

修改 您可以通过在活动中设置android:launchMode =“ singleTop”来使用另一种解决方案来解决该问题,但该解决方案可能不适用于所有应用程序。

答案 3 :(得分:0)

启动Activity时,将打开第一页!但是,当按下后退按钮时,它将在活动的已保存状态之间导航。要模拟按下的后退按钮,您可以尝试以下操作:

@Override
public void onBackPressed() {
    finish();  //your choice, thought not needed as super.onBackPressed(); is called if nothing is assigned here
}

或在工具栏上的后退按钮上单击,单击:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});