如何解决将片段放入视图时自动创建的新arraylist
我正在创建一个应用程序,用户可以在该应用程序中查看其得分历史记录,并且运行良好,只是每当我直接单击该片段时,就会自动使用先前的自定义项创建一个新的数组列表。当我使用savebutton意图到达片段时,不会出现此类问题,并且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
}
}
然后我在oncreateView方法中调用saveScore()
我的分数片段像这样附加到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()
和onResume
放在onSaveInstanceState
中,但是它没有任何改变。
在我的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<>();
}
}
我该如何解决这个问题?
解决方法
getIntent()
始终会返回您用于创建该活动的Intent-因此,如果您使用该菜单项来开始一个新的活动并添加额外的内容
Intent save = new Intent(getApplicationContext(),ScoreActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_DATE",format);
save.putExtras(extras);
startActivity(save);
然后,当您致电getIntent
时,Activity将始终返回此Intent + Extras捆绑包。因此,如果您的片段在其onViewCreated
中有此内容:
Intent intent = requireActivity().getIntent();
Bundle extras = intent.getExtras();
及其父活动最初是使用Intent + Extras组合创建的,然后它将运行您添加的代码
老实说,这取决于您的应用设置方式,所以我只能为您提供一些注意事项
-
如果您有一个活动,可以交换片段,因此
ScoreFragment
可以重新添加(您提到了“使用导航抽屉导航到片段”),那么onViewCreated
将运行再次使用该意图。 -
如果它不在屏幕上,并且系统破坏了其视图以节省内存,则在重新创建它时,它将以该意图再次运行
onViewCreated
。 -
如果您在不同的地方调用
startActivity
,但是现有的Activity被重用(例如您的Activity以singleTop or singleInstance启动),那么它将具有最初创建时使用的Intent + Extras 。因此,如果您首先通过带有附加项的菜单项创建它,然后在其他地方没有附加项的情况下调用startActivity()
,则如果原始活动被使用,它将仍然具有创建时使用的Intent + Extras。 (它将通过onNewIntent()
接收新的意图,但不会更改getIntent
的值) -
而且,您实际上并没有在检查Extras捆绑包中是否有
EXTRA_DATE
项,就算它有 some 个Extras,然后又要添加一个新的{{ 1}},返回任何ScoreItem
(可能为null)。因此,如果您在不同情况下与其他捆绑包一起启动,您可能仍会获得额外的分数
我知道很多事情不是解决方案,但希望对您有所帮助!老实说,我建议在extras.getString("EXTRA_DATE")
中设置一个断点,调试应用程序并使用调试器查看saveScore
给您的内容,以及它看起来是否正确。
所以我设法解决了这个问题,但是我不知道我实际上做了什么。我决定为我的应用程序创建一个简单的启动屏幕,问题就消失了。我现在很困惑,希望在解决该问题时能有所帮助,以便将来纠正。
我创建了一个名为SplashScreenActivity的新活动
hash(const char* data,size_t size)
}
然后,我将MainActivity的intent过滤器移至Manifest.xml中的启动画面活动中 文件,这就是我认为改变了事情。
public class SplashScreenActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EasySplashScreen config = new EasySplashScreen(SplashScreenActivity.this)
.withFullScreen()
.withTargetActivity(MainActivity.class)
.withSplashTimeOut(5000)
.withBackgroundColor(Color.parseColor("#FF9800"))
.withHeaderText("Header")
.withFooterText("Footer")
.withBeforeLogoText("Before Logo Text")
.withAfterLogoText("After Logo Text")
.withLogo(R.mipmap.ic_launcher_round);
config.getHeaderTextView().setTextColor(Color.WHITE);
config.getFooterTextView().setTextColor(Color.WHITE);
config.getBeforeLogoTextView().setTextColor(Color.WHITE);
config.getAfterLogoTextView().setTextColor(Color.WHITE);
View easySplashScreen = config.create();
setContentView(easySplashScreen);
}
我几次将其移回MainActivity,并且我意识到每次Intent过滤器位于MainActivity中时问题都会再次出现。现在,我将其保存在清单中的 <activity android:name=".SplashScreenActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
中,没有任何此类问题。我真的需要一些解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。