【问题标题】:How do fragments of an activity get restored when the activity restarts?Activity 重新启动时,Activity 的片段如何恢复?
【发布时间】:2019-05-24 21:00:59
【问题描述】:

我正在测试系统由于 RAM 不足而终止应用程序进程后用户进入我的应用程序的情况。我看到了意外的行为,希望能得到一些帮助。

在我的应用程序中,我有一个活动,我们称之为ActivityA,它会立即创建一个片段Fragment A,并进行片段替换。 FragmentA 显示一个 ListView,其中包含两个项目。如果用户单击第一项,则会创建第二个片段 Fragment B 并替换 FragmentA。否则,将创建另一个FragmentA 并替换原来的FragmentA。我正在尝试创建一个文件目录树。 FragmentA 用于目录,FragmentB 用于文件。

假设用户点击了一个文件。这是测试中用户切换到另一个应用程序的阶段,系统由于内存不足而终止了我的应用程序的进程。然后,用户返回我的应用程序,期望一切都保持原样。然而,实际发生的是Fragment A(父目录)而不是Fragment B(文件)。当用户单击后退按钮时,将显示Fragment B(文件)。我做错了什么导致系统以这种方式恢复后台堆栈?

这是一个示例程序,进一步展示了我的应用正在做什么:

// 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();
        }
    }
}

【问题讨论】:

  • 您是否尝试使用带有第三个参数“tag”的replace 方法来识别fragmentB 的每个实例?

标签: java android android-fragments android-activity android-lifecycle


【解决方案1】:

当您调用super.onCreate() 时,当savedInstanceState 不为空时,Fragments 会自动恢复其当前状态。

因此,如果您希望通过添加初始 Fragment 进行一次设置,则应始终在其周围加上 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();
    }
}

【讨论】:

  • 这解决了问题!谢谢!据我所知,没有savedInstanceState 检查会创建一个额外的FragmentA 片段,这就是为什么我在切换回应用程序时看到该片段的视图?
  • @ChaseFarmer - 是的!您将获得自动恢复的实例以及 FragmentA 的全新实例。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2015-10-24
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多