我正在测试的情况下,用户进入我的应用程序后,系统已终止应用程序进程,由于内存不足。我看到了意想不到的行为,希望能得到一些帮助。
在我的应用程序中,我有一个活动,我们称它为ActivityA
,它立即创建一个片段Fragment A
,并进行片段替换。FragmentA
显示包含两个项目的ListView
。如果用户单击第一项,则会创建第二个片段Fragment B
,并替换FragmentA
。否则,将创建另一个FragmentA
,并替换原来的FragmentA
。我正在尝试创建一个文件目录树。FragmentA
表示目录,FragmentB
表示文件。
假设用户单击了一个文件。这是测试阶段,用户切换到另一个应用程序,系统由于内存不足而终止我的应用程序进程。然后,用户回到我的应用程序中,希望一切都保持原来的样子。但是,实际发生的是显示Fragment A
(父目录)而不是显示Fragment B
(文件)。当用户单击后退按钮时,将显示Fragment B
(文件)。我做错了什么导致系统以这种方式恢复backback?
下面是一个示例程序,进一步说明我的应用程序正在执行的操作:
// ActivityA.java
public class ActivityA extends AppCompatActivity implements onItemClickListener
{
@Override
public void onCreate(Bundle savedInstanceState)
{
FragmentA fragA = new FragmentA();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransation.replace(R.id.basic_frame, fragA);
fragmentTransaction.commit();
}
@Override
public void onItemClick(AdapterView<?> aView, View v, int position, long id)
{
if (position == 0)
{
FragmentB fragB = new FragmentB();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransation.replace(R.id.basic_frame, fragB);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
else
{
FragmentB fragA = new FragmentA();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransation.replace(R.id.basic_frame, fragA);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
}
最佳答案
当您调用super.onCreate()
时,当savedInstanceState
不为空时,片段会自动恢复其当前状态。
因此,如果希望通过添加初始片段来完成一次设置,则应始终使用if (savedInstanceState == null)
检查将其包围:
@Override
public void onCreate(Bundle savedInstanceState)
{
// I assume you accidentally left out these lines
super.onCreate(savedInstanceState);
setContentView(R.id.your_content_view);
if (savedInstanceState == null) {
FragmentA fragA = new FragmentA();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransation.replace(R.id.basic_frame, fragA);
fragmentTransaction.commit();
}
}