碎片似乎相互堆叠 - 导致问题,android
Fragments seem to be stacking on top of each other - causing problems, android
因为我对片段还很陌生,所以一整天我都在为这个问题焦头烂额。基本上,我在一个应用程序中有一个片段可以跟踪玩家的货币。我想在整个应用程序中重复使用一个片段,因为它引用了一个存储玩家货币的单例 class 并设置了一个 TextView 来显示该货币。
问题是,在每个 activity 中,我在 activity 启动时初始化一个新片段,如下所示:
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());
}
}
您的 Handler
继续发布 update()
即使片段已暂停,您应该将处理程序代码移至 onResume()
并在 [= 中使用 handler.removeCallbacksAndMessages(null)
15=] 以防止在片段暂停时调用 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();
}
因为我对片段还很陌生,所以一整天我都在为这个问题焦头烂额。基本上,我在一个应用程序中有一个片段可以跟踪玩家的货币。我想在整个应用程序中重复使用一个片段,因为它引用了一个存储玩家货币的单例 class 并设置了一个 TextView 来显示该货币。
问题是,在每个 activity 中,我在 activity 启动时初始化一个新片段,如下所示:
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());
}
}
您的 Handler
继续发布 update()
即使片段已暂停,您应该将处理程序代码移至 onResume()
并在 [= 中使用 handler.removeCallbacksAndMessages(null)
15=] 以防止在片段暂停时调用 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();
}