我在youtube上关注this教程并遇到了最终结果的问题。
本教程的目标是通过在按钮下方的布局中添加/删除/替换片段来引入片段事务。一切顺利,直到最后。
如果我点击"添加A"按钮,它在下面的布局中添加了Frag_A,如果你点击删除,它就会消失。但是,如果你点击了#34;添加A" 2次以上,然后你需要删除2次以上,以摆脱所有这些。同样,如果你点击"添加A"然后"添加B",你需要点击"删除A"首先,你可以看到片段B。
在视频结束时,他们在"删除"中添加了if语句。检查片段是否已存在的方法。
public void RemoveA (View v) {
FragmentA FA = (FragmentA) manager.findFragmentByTag("A");
FragmentTransaction transaction = manager.beginTransaction();
if (FA != null) {
//remove the transaction and commit
}
else {
//Toast a message to say the FragmentA doesn't exist yet
}
}
所以我想我可以在" AddA"中加入类似的东西。检查FragmentA是否存在的方法,然后向其提供一条消息说它已经存在,如果它不存在,添加它以避免在你只需要1时创建它们。
public void AddA (View v) {
FragmentA FA = (FragmentA) manager.findFragmentByTag("A");
FragmentTransaction transaction = manager.beginTransaction();
if (FA != null) {
Toast.maketext(this, "Fragment already exists", Toast.LENGTH_SHORT).show());
}
else {
transaction.add(FA);
transaction.commit();
}
}
然而,当你点击" AddA"时,这就是这样,程序只会出现意外错误并退出。看看Logcat(我上周开始学习,所以我不知道一切意味着什么),我注意到在nullpointerexception
提到transaction.add(FA);
的一行:
if (FA != null)
同时,IntelliJ说:
{{1}}
总是如此,FA ==总是假的。我也试过追加&&看不见,但这也没有什么不同。对于为什么会发生这种情况有什么想法吗?
这是我的第一篇文章,我无法在google / search上找到答案。
答案 0 :(得分:0)
查看您的代码:
if (FA != null) { // here FA is not null
Toast.maketext(this, "Fragment already exists", Toast.LENGTH_SHORT).show()); }
else { // here, FA is null!
transaction.add(FA); // same as transaction.add(null);
transaction.commit();
}
在else
块中,在将其添加到事务中之前,您缺少一些代码,您将在FA中创建新片段。
if (FA != null) {
Toast.maketext(this, "Fragment already exists", Toast.LENGTH_SHORT).show()); }
else {
// Create a new fragment here and set it to FA
transaction.add(FA);
transaction.commit();
}