首页 > 解决方案 > 将片段放入视图时自动创建新的数组列表

问题描述

我正在创建一个应用程序,用户可以在其中查看他们的分数历史记录,它工作正常,除了每当我直接单击片段时,都会使用以前的自定义项自动创建一个新的 arraylist 列表。当我使用保存按钮意图访问片段时,不会出现此类问题,并且 recyclerview 会按照我的意愿进行更新。

这就是我使用导航菜单项保存分数的方式

case R.id.save_game:
            Intent save = new Intent(getApplicationContext(), ScoreActivity.class);
            Bundle extras = new Bundle();
            extras.putString("EXTRA_DATE", format);
            save.putExtras(extras);
            startActivity(save);
            Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
            break;

我在我的 ScoreFragment 中收到了意图

 public void saveScore(){

    Intent intent = requireActivity().getIntent();
    Bundle extras = intent.getExtras();

    if (extras != null) {

        String format = extras.getString("EXTRA_DATE");

        mScoreList.add(new ScoreItem(TeamAName, TeamBName, scoreTeamA, scoreTeamB, format));

        saveData(); //Saves Arraylist to sharedpreferences

    }
}

然后我调用saveScore()我的 oncreateView 方法

我的分数片段像这样附加到 ScoreActivity

public class ScoreActivity extends AppCompatActivity {

@Override
protected void onCreate( Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_category);


    if (savedInstanceState == null) {

        getSupportFragmentManager().beginTransaction().replace(R.id.container,
                new ScoreFragment()).commit();
    }

}

}

我试过把我的saveScore()方法onViewCreated()也放进去onResumeonSaveInstanceState但它并没有改变任何东西。

在我的 ScoreActivity 中更改replace()为也无济于事。add()

就在我给我的 rootView 充气后,我打电话给我loadData(),我一直试图在其他地方调用它,但它会导致崩溃。

 private void loadData() {
    SharedPreferences sharedPreferences = requireActivity().getSharedPreferences("shared preferences", Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("task list", null);
    Type type = new TypeToken<ArrayList<ScoreItem>>() {
    }.getType();
    mScoreList = gson.fromJson(json, type);

    if (mScoreList == null) {
        mScoreList = new ArrayList<>();
    }
}

我该如何解决这个问题?

标签: javaandroidandroid-fragments

解决方案


getIntent()总是返回你用来创建那个 Activity 的 Intent - 所以如果你使用那个菜单项来开始一个新的并添加额外的

Intent save = new Intent(getApplicationContext(), ScoreActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_DATE", format);
save.putExtras(extras);
startActivity(save);

那么当您调用getIntent. 因此,如果您的片段中包含以下内容onViewCreated

    Intent intent = requireActivity().getIntent();
    Bundle extras = intent.getExtras();

并且它的父活动最初是使用 Intent+Extras 组合创建的,然后它将运行您的添加代码


老实说,这取决于您的应用程序的设置方式,因此我只能为您提供要查看的内容的想法

  • 如果您有一个片段被交换的活动,那么ScoreFragment可以重新添加(您提到“使用导航抽屉导航到片段”)然后onViewCreated将使用该 Intent 再次运行。

  • 如果它在屏幕外并且系统破坏了它的视图以节省内存,那么当它重新创建时,它将onViewCreated再次使用该 Intent 运行。

  • 如果您startActivity在不同的地方调用,但现有的 Activity 被重用(例如您的 Activity 作为singleTop 或 singleInstance启动),那么它将具有最初创建时使用的 Intent+Extras。因此,如果您首先通过带有附加功能的菜单项创建它,然后startActivity()从其他地方不使用附加功能进行调用,如果原始活动被使用,它将仍然具有创建它时使用的 Intent+Extras。(它会通过接收新的意图,onNewIntent()但不会改变 的值getIntent

  • 此外,您实际上并没有检查 extras Bundle 是否具有该EXTRA_DATE项目,只是它是否具有一些附加功能,然后您正在添加一个ScoreItem带有任何extras.getString("EXTRA_DATE")返回值的新项(可能是“null”)。因此,如果您在不同情况下与其他捆绑包一起启动,您可能仍会获得额外的分数

我知道这很多,这不是一个解决方案,但希望它有所帮助!老实说,我建议在 中设置断点saveScore,调试应用程序并使用调试器查看getIntent给你的信息,以及它是否正确。


推荐阅读