【问题标题】:Instantiate a fragment from a string from shared preferences从共享首选项的字符串中实例化片段
【发布时间】: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


【解决方案1】:

如果你真的需要:

Fragment fragment = Class.forName("your.package.name.YourFragmentClassName").newInstance()

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2020-07-21
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多