Таймер сбрасывается при изменении фрагмента, add () укладывает фрагменты друг на друга - PullRequest
0 голосов
/ 10 марта 2019

В настоящее время у меня есть 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 создает еще один таймер, и теперь есть два таймера. Есть идеи, что с этим делать? Как бы я закодировал его так, чтобы таймер не сбрасывался при изменении фрагмента?

Я думаю, что hide и show могли бы работать здесь, но я не уверен, как применить это в моей ситуации, когда у меня есть 3 фрагмента для переключения.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я думаю, что здесь могут сработать прятки, но я не знаю, как подать заявку что в моей ситуации, когда у меня есть 3 фрагмента для переключения.

Вы правы, пожалуйста, следуйте приведенному ниже примеру, чтобы применить к своему коду.

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    private final Fragment mTimerFragment = new TimerFragment();
    private final Fragment mListFragment = new ListFragment();
    private final Fragment mReminderFragment = new RemindFragment();

    private Fragment mActiveFragment = mTimerFragment;

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

        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragContainer, mReminderFragment, "TimerFragment")
                .hide(mReminderFragment)
                .commit();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragContainer, mListFragment, "ListFragment")
                .hide(mListFragment)
                .commit();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragContainer, mTimerFragment, "ReminderFragment")
                .commit();

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

    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
                getSupportFragmentManager().beginTransaction()
                        .hide(mActiveFragment)
                        .show(mTimerFragment)
                        .commit();
                mActiveFragment = mTimerFragment;
                return true;
            case R.id.navigation_dashboard:
                getSupportFragmentManager().beginTransaction()
                        .hide(mActiveFragment)
                        .show(mListFragment)
                        .commit();
                mActiveFragment = mListFragment;
                return true;
            case R.id.navigation_notifications:
                getSupportFragmentManager().beginTransaction()
                        .hide(mActiveFragment)
                        .show(mReminderFragment)
                        .commit();
                mActiveFragment = mReminderFragment;
                return true;
        }

        return false;
    }
}
0 голосов
/ 10 марта 2019

Возможно, новый фрагмент таймера создается при выборе навигации для фрагмента в onNavigationItemSelected.Это было бы мое предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...