Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓说,碎片似乎堆叠在一起,造成了问题_Java_Android_Android Fragments_Fragmentmanager - Fatal编程技术网

Java 安卓说,碎片似乎堆叠在一起,造成了问题

Java 安卓说,碎片似乎堆叠在一起,造成了问题,java,android,android-fragments,fragmentmanager,Java,Android,Android Fragments,Fragmentmanager,我一整天都在为这件事发愁,因为我对碎片还很陌生。基本上,我的应用程序中有一个片段,可以跟踪玩家的货币。我想在整个应用程序中重用一个片段,因为它引用了一个存储玩家货币的singleton类,并设置一个TextView来显示该货币 问题在于,在每个活动中,我都会在活动开始时初始化一个新片段,如下所示: FragmentTransaction ft=getSupportFragmentManager().beginTransaction(); ft.replace(R.id.fmang2,新碎片1()

我一整天都在为这件事发愁,因为我对碎片还很陌生。基本上,我的应用程序中有一个片段,可以跟踪玩家的货币。我想在整个应用程序中重用一个片段,因为它引用了一个存储玩家货币的singleton类,并设置一个TextView来显示该货币

问题在于,在每个活动中,我都会在活动开始时初始化一个新片段,如下所示:

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何时添加货币,或者只加载前一个货币。经过一段时间,已经出现了英雄。先生,你是他们中的一员。非常感谢你,我花了一整天的时间在这上面。