【问题标题】:Timer resets when fragment changes, add() stacks fragments on top of each other当片段更改时计时器重置,add() 将片段堆叠在一起
【发布时间】:2019-03-10 01:59:51
【问题描述】:

我目前在底部导航中有 3 个片段。其中一个片段包含一个计时器。当您启动计时器、更改片段并返回计时器片段时,问题就出现了。它会重置。

主要活动

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadFragment(new TimerFragment());

        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(this);

    }

    private boolean loadFragment (Fragment fr) {
        if (fr != null){
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragContainer,fr)
                    .commit();
            return true;
        }
        return false;
    }

   public boolean onNavigationItemSelected (@NonNull MenuItem item) {
        Fragment fr = null;

        switch (item.getItemId()){
            case R.id.navigation_home:
                fr = new TimerFragment();
                break;

            case R.id.navigation_dashboard:
                fr = new ListFragment();
                break;

            case R.id.navigation_notifications:
                fr = new RemindFragment();
                break;
        }

        return loadFragment(fr);
   }


}

定时器片段

public class TimerFragment extends Fragment {

    TextView tvTimer;
    long startTime = 0;
    Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            long millis = System.currentTimeMillis() - startTime;
            int seconds = (int)(millis/1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;
            tvTimer.setText(String.format("%d:%02d", minutes, seconds));
            timerHandler.postDelayed(this,500);
        }
    };



    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag_timer, null);

        tvTimer = (TextView)view.findViewById(R.id.tvTimer);
        Button btn = (Button)view.findViewById(R.id.btn1);

        btn.setText("Start");
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button b = (Button) v;

                if (b.getText().equals("Stop")){
                    timerHandler.removeCallbacks(timerRunnable);
                    b.setText("Start Monitoring");
                }

                else {
                    startTime = System.currentTimeMillis();
                    timerHandler.postDelayed(timerRunnable, 0);
                    b.setText("Stop");
                    Toast.makeText(getActivity(),"Monitoring started.",Toast.LENGTH_SHORT).show();
                }
            }
        });
        return view;
    }
}

我尝试做的一件事是add 片段而不是replace。它没有在更换碎片时重置计时器,而是将碎片堆叠在一起,看起来像一团乱七八糟的东西。回到 TimerFragment 创建另一个计时器,现在有两个计时器。知道该怎么做吗?我如何以片段更改时计时器不会重置的方式对其进行编码?

我认为 hideshow 可以在这里工作,但我不确定如何在我有 3 个片段要切换的情况下应用它。

【问题讨论】:

    标签: android android-fragments timer


    【解决方案1】:

    选择导航时可能会创建一个新的计时器片段 对于 onNavigationItemSelected 中的片段。这是我的猜测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多