代码之家  ›  专栏  ›  技术社区  ›  Ujjwal Jung Thapa

当片段在选项卡式活动中更改时在片段中运行的双计时器

  •  0
  • Ujjwal Jung Thapa  · 技术社区  · 6 年前

    我在android中实现了一个选项卡式活动。它包含3个片段中的3个标签。在一个片段上我设置了一个倒计时。

    我的问题是: 在切换选项卡式活动中的片段并通过tab返回带计时器的片段时, 我的旧计时器值将继续,但计时器值的新实例也将同时运行 即,显示第一个设置的定时器值,然后切换到新的设置的定时器值,然后切换到第一个设置的时间,依此类推。

    选项卡式活动与android studio提供的活动相同,对打开片段的更改很小,如下所示:

    private SectionsPagerAdapter mSectionsPagerAdapter;
    
    private ViewPager mViewPager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        mViewPager = findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
    
        TabLayout tabLayout = findViewById(R.id.tabs);
    
        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    
    }
    
    public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            switch (position){
                case 0:
                    fragment = new FragmentA();
                    break;
                case 1:
                    fragment = new FragmentB();
                    break;
                case 2:
                    fragment = new FragmentC();
                    break;
            }
            return fragment;
        }
    
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }
    }
    

    我用fragmenta实现了倒计时:

    public class FragmentA extends Fragment {
    TextView mCountDown;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_A, container, false);
    }
    
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mCountDown = view.findViewById(R.id.tv1);
    
        new CountDownTimer(100000, 1000) {
    
            @Override
            public void onTick(long millisUntilFinished) {
                long check = millisUntilFinished;
                int hour = (int) check / (1000 * 60 * 60);
                check = (int) (check - (hour * 1000 * 60 * 60));
                int min = (int) check / (1000 * 60);
                check = (int) (check - (min * 1000 * 60));
                int sec = (int) check / (1000);
    
                mCountDown.setText(hour + " : " + min + " : " + sec);
            }
    
            @Override
            public void onFinish() {
                mCountDown.setText("Reached");
            }
        }.start();
    
    }
    }
    

    如果有人能帮助我,我会非常感激的。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ujjwal Jung Thapa    6 年前

    好吧,问题出在碎片上。我已经在 onViewCreated()方法 这就产生了问题。

    所以解决方案是初始化oncreate()方法的毫秒值,并使用该值启动onviewcreated()方法的倒计时。并且还使用onresume()方法继续相同的计时器,尽管片段是通过选项卡更改的。(为了避免重复代码,还创建了一个计时器的小方法。)

    碎片代码:

    public class FragmentA extends Fragment {
    private long millisecvalue;
    TextView mCountDown;
    CountDownTimer countDownTimer;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        millisecvalue = 1000000;        //initial timer value
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_A, container, false);
    }
    
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
    
        mCountDown = view.findViewById(R.id.tv1);
    
        startContinueTimer();
    
    }
    
    private void startContinueTimer() {
        countDownTimer =  new CountDownTimer(millisecvalue, 1000) {
    
            @Override
            public void onTick(long millisUntilFinished) {
                long check = millisUntilFinished;
                int hour = (int) check / (1000 * 60 * 60);
                check = (int) (check - (hour * 1000 * 60 * 60));
                int min = (int) check / (1000 * 60);
                check = (int) (check - (min * 1000 * 60));
                int sec = (int) check / (1000);
    
                mCountDown.setText(hour + " : " + min + " : " + sec);
                millisecvalue = millisUntilFinished;    //update milisecvalue "VERY IMPORTANT"
            }
    
            @Override
            public void onFinish() {
                mCountDown.setText("Reached");
            }
        }.start();
    }
    
    @Override
    public void onResume() {
        super.onResume();
        startContinueTimer();
    }
    }
    

    希望这有帮助。如果有更好的方法,请告诉我!