Java 安卓说,碎片似乎堆叠在一起,造成了问题
我一整天都在为这件事发愁,因为我对碎片还很陌生。基本上,我的应用程序中有一个片段,可以跟踪玩家的货币。我想在整个应用程序中重用一个片段,因为它引用了一个存储玩家货币的singleton类,并设置一个TextView来显示该货币 问题在于,在每个活动中,我都会在活动开始时初始化一个新片段,如下所示:Java 安卓说,碎片似乎堆叠在一起,造成了问题,java,android,android-fragments,fragmentmanager,Java,Android,Android Fragments,Fragmentmanager,我一整天都在为这件事发愁,因为我对碎片还很陌生。基本上,我的应用程序中有一个片段,可以跟踪玩家的货币。我想在整个应用程序中重用一个片段,因为它引用了一个存储玩家货币的singleton类,并设置一个TextView来显示该货币 问题在于,在每个活动中,我都会在活动开始时初始化一个新片段,如下所示: FragmentTransaction ft=getSupportFragmentManager().beginTransaction(); ft.replace(R.id.fmang2,新碎片1()
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fmang2,新碎片1());
ft.commit();
这会导致碎片堆叠,这是一个问题,因为碎片不断地向玩家的余额中添加货币。因此,如果我创建了3个活动,玩家将以3倍的速度收到货币
我该如何解决这个问题?我也尝试过用XML创建片段,但那没有帮助。
以下是我的片段中的代码供参考:
package com.example.bunzclicker;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.HandlerThread;
导入android.util.Log;
导入android.view.InflateException;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.fragment.app.FragmentManager;
导入com.example.bunzclicker.bunz.bunz;
导入java.math.BigDecimal;
导入java.util.Timer;
导入java.util.TimerTask;
公共类fragment1扩展了Fragment{
私人文本视图bunz_计数;
私人文本查看金钱计数;
私人床铺;
私人经办人;
私有HandlerThread mHandlerThread;
int延迟=1000;
视图;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
bunz=bunz.getInstance();
handler=新的handler();
视图=充气机。充气(R.layout.fragment1,容器,假);
handler.postDelayed(新的Runnable(){
公开募捐{
更新(查看);
handler.postDelayed(这个,delay);
}
},延误);
返回视图;
}
公共无效更新(视图){
bunz_计数=(TextView)view.findViewById(R.id.final_bunz_计数);
money\u count=(TextView)view.findViewById(R.id.final\u money\u count);
//System.out.println(bunz.getBaker1());
BigDecimal数字=((BigDecimal.valueOf
(bunz.getBaker1()).multiply(BigDecimal.valueOf(.1));
//).add((BigDecimal.valueOf(bunz.getBaker2()).multiply(BigDecimal.valueOf(.2)))。
//添加((BigDecimal.valueOf
//(bunz.getBaker3()).multiply(BigDecimal.valueOf(.4)))。
//添加((BigDecimal.valueOf
//(bunz.getBaker4()).multiply(BigDecimal.valueOf(.8)))。
//add((BigDecimal.valueOf(bunz.getBaker5()).multiply(BigDecimal.valueOf(1)))。
//add((BigDecimal.valueOf(bunz.getBaker6()).multiply(BigDecimal.valueOf(2)))。
//add((BigDecimal.valueOf(bunz.getBaker7()).multiply(BigDecimal.valueOf(4)))。
//add((BigDecimal.valueOf(bunz.getBaker8()).multiply(BigDecimal.valueOf(5)))。
//加法((BigDecimal.valueOf(bunz.getBaker9()).multiply(BigDecimal.valueOf(10)));
//系统输出打印项次(编号);
bunz.setBunz(bunz.getBunz().add((number));
bunz_count.setText(“bunz:+bunz.getBunz());
money_count.setText(“money:+bunz.getMoney());
System.out.println(“bunz”+bunz.getBunz());
}
}
您的处理程序一直在发布update()
即使片段已暂停,您也应该将处理程序代码移动到onResume()
并使用处理程序。在onPause
中删除callbacksandsessages(null)
以防止在片段暂停时调用update()
。你需要按照以下思路做一些事情
@Override
public void onResume() {
super.onResume();
handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
update(view);
handler.postDelayed(this, delay);
}
}, delay);
}
@Override
public void onPause() {
handler.removeCallbacksAndMessages(null);
super.onPause();
}
也许你不应该在创建片段时添加货币,你可以使用一个额外的布尔值来指示你应该在片段创建时添加货币。嗯,你是什么意思?我的意思是,你在使用片段时做得对,这很好,但问题不在于在每个活动中都创建片段,问题在于你的逻辑本身。你知道意念临时演员是怎么工作的吗?你可以创建一个标志来检查你是否应该添加货币,这样你可以创建片段3次,但只需添加一次货币。啊,我知道intent extras,但我不确定我在这里会如何使用它。按照我的设置方式,它只是全天候自动增加货币。有什么我需要解决的吗?你是用setBunz方法解决的,对吗?您应该在片段中的布尔额外值为true时添加货币,否则您只需加载用户货币,因此在您的所有活动中,您必须使用此额外值实例化您的片段,告诉fragmnet何时添加货币,或者只加载前一个货币。经过一段时间,已经出现了英雄。先生,你是他们中的一员。非常感谢你,我花了一整天的时间在这上面。