【发布时间】:2018-01-17 17:52:17
【问题描述】:
所以我有一个 onCreate 方法,它有一个片段事务和一个名为 selectedFragment 的片段,我在每个菜单案例中都会更改它。我想保存那类片段当应用程序暂停以实例化相同的 onResume/onRestart 时,我使用方法 saveInfo 将该片段名称保存在 SharedPreferences 中的字符串中:
@Override
protected void onPause() {
super.onPause();
saveInfo();
Toast.makeText(this, "Pause", Toast.LENGTH_SHORT).show();
}
protected void onResume(){
super.onResume();
SharedPreferences sharedPreferences = getSharedPreferences("selectedFragment", Context.MODE_PRIVATE);
String fragmentType = sharedPreferences.getString("fragmentType", "");
Toast.makeText(this, fragmentType, Toast.LENGTH_SHORT).show();
}
public void saveInfo(){
SharedPreferences sharedPreferences = getSharedPreferences("selectedFragment", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("fragmentType", selectedFragment.getClass().getSimpleName());
editor.apply();
}
所有信息都正确显示,但我无法实例化片段,我尝试使用selectedFragment = Fragment.instantiate(getApplicationContext(), fragmentType) 和selectedFragment = Class.forName(fragmentType).newInstance(); 并返回此异常未处理的异常:java.lang.ClassNotFoundException
PD:我从 SharedPreferences 获得的 fragmentType 字符串是正确的。
【问题讨论】:
-
如果不需要,为什么要复杂化?使用 if/else 查看要实例化的片段。只有当有一个特定的原因来避免它时,比如有 10-20 个不同的可能片段,我对此表示怀疑。
-
您可以在分片交易期间将分片添加到后台堆栈,并在需要时使用
findFragmentByTag与分片管理器进行检查,传递您在分片交易期间添加的标签。如果存在,则替换现有片段或创建一个新片段并将其添加到后台堆栈。您可以通过调用构造函数来创建一个实例。 -
我不应该能够从字符串实例化片段吗?我将添加更多片段,这样可以避免我每次都来更改此方法添加另一个 if
标签: java android android-fragments android-sharedpreferences