碎片似乎彼此堆叠-引起问题,Android

时间:2019-08-28 19:42:05

标签: java android android-fragments fragmentmanager

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

问题在于,在每个活动中,我都会在活动开始时初始化一个新的片段,就像这样:

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fmang2, new fragment1());
        ft.commit();

这会导致碎片堆积,这是一个问题,因为碎片会不断增加玩家的余额。因此,如果我创建了3个活动,其中3个活动,则玩家收到货币的速度将达到应有的3倍。

该如何解决?我也尝试过使用XML创建片段,但这没有帮助。 供参考,这是我的片段中的代码:

package com.example.bunzclicker;


import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.example.bunzclicker.bunz.Bunz;

import java.math.BigDecimal;
import java.util.Timer;
import java.util.TimerTask;

public class fragment1 extends Fragment {
    private TextView bunz_count;
    private TextView money_count;
    private Bunz bunz;
    private Handler handler;
    private HandlerThread mHandlerThread;
    int delay = 1000;
    View view;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        bunz = Bunz.getInstance();
        handler = new Handler();


        view = inflater.inflate(R.layout.fragment1, container, false);



        handler.postDelayed(new Runnable(){
            public void run(){
                update(view);
                handler.postDelayed(this, delay);
            }
        }, delay);






        return view;
    }





    public void update(View view){
        bunz_count = (TextView) view.findViewById(R.id.final_bunz_count);
        money_count = (TextView) view.findViewById(R.id.final_money_count);
        //System.out.println(bunz.getBaker1());


        BigDecimal number = ((BigDecimal.valueOf
                (bunz.getBaker1()).multiply(BigDecimal.valueOf(.1))));
//        ).add((BigDecimal.valueOf(bunz.getBaker2()).multiply(BigDecimal.valueOf(.2)))).
//                add((BigDecimal.valueOf
//                        (bunz.getBaker3()).multiply(BigDecimal.valueOf(.4)))).
//                add((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)))).
                //add((BigDecimal.valueOf(bunz.getBaker9()).multiply(BigDecimal.valueOf(10))));
        //System.out.println(number);
        bunz.setBunz(bunz.getBunz().add((number)));
        bunz_count.setText("Bunz: " + bunz.getBunz());
        money_count.setText("Money: " + bunz.getMoney());
        System.out.println("bunz" + bunz.getBunz());

    }
}



1 个答案:

答案 0 :(得分:1)

即使片段已暂停,您的Handler仍会发布update(),您应将处理程序代码移至onResume()并在{{1}中使用handler.removeCallbacksAndMessages(null) },以防止在片段暂停时onPause调用。您需要按照以下几行进行操作,

update()
相关问题