我有两个活动A
和B
。
活动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);
时,所选选项卡和滚动位置不会被记住,而是设置为初始值
有人可以告诉我这里发生了什么吗?
答案 0 :(得分:2)
1)从活动A导航到活动B时,Android系统不会破坏活动A,而是将活动A移至后堆栈并将B添加至前景。这就是为什么当您按下后退按钮或从Java代码活动B调用onBackPressed()
时,B被销毁而A被设置为前台的原因。这是文档中的示例:Understand Tasks and Back 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();
}
});