>source

3 개의 조각으로 구성된 탭 활동이 있습니다. 첫 번째 프래그먼트는 사용자가 테스트를 선택할 수 있도록하고, 세 번째 프래그먼트에는 타이머와 텍스트보기 및 일부 버튼이 있습니다. 두 번째 조각은 현재 아무것도 없습니다.

조각 3 안에 타이머를 시작하는 버튼이 있습니다. 타이머가 시작되면 텍스트보기가 1 분마다 새로 고쳐지고 경과 시간이 표시됩니다. 이 시점까지 모든 것이 잘 작동합니다.

문제 : 조각 1을 선택하고 조각 3으로 돌아 가면 타이머가 시작되면 타이머가 textView 업데이트를 중지합니다. timer_elapsed가 올바르게 실행되고 textview 만 업데이트되지 않음을 알고 있습니다.

FragmentActivity.RunOnUiThread (() =>{})를 시도했습니다. 조각이 전환 될 때까지 제대로 작동합니다.

Loopers.MainLooper를 사용하여 화면을 업데이트하려고 시도했지만 문제는 여전히 동일합니다.

// update the screen every minute
                if (mActivity != null)
                { 
                    mActivity.RunOnUiThread(() =>
                    {
                        // set the progress bar
                        progressBar.Progress = i32ProgressBarValue;
                        textViewPercentage.Text = i32ProgressBarValue + "%";
                        // set the text view
                        textViewTestTime.Text = $"{Globals.i32Days}" + "D :" + $"{Globals.i32Hours}" + "H :" + $"{Globals.i32Mins}" + "M";
                    });
                }

프래그먼트가 전환되어 다시 프래그먼트 3으로 돌아 왔을 때 textView가 계속 올바르게 업데이트되기를 원합니다

  • 답변 # 1

    나는 세 개의 조각이있는 TabbedActivity (BottomNavigationView 사용)에서 샘플 사용 타이머를 사용합니다. 세 번째 조각에서는 버튼을 사용하여 2 초마다 업데이트 버튼의 텍스트 타이머를 시작합니다. 아래의 세 번째 조각의 코드는 다음과 같습니다.

    Timer _dispatcherTimer;
    TimerCallback timerDelegate;
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
            View view = inflater.Inflate(Resource.Layout.fragment_account, container, false);
            init(view);
            timerDelegate = new TimerCallback(Tick);
            return view;
        }
       private void init(View view)
        {
            button = view.FindViewById<Button>(Resource.Id.mybutton);
            button.Click += delegate
            {
                _dispatcherTimer = new System.Threading.Timer(timerDelegate, null, 0, 2000);
            };
        }
        private void Tick(object state)
        {
            this.Activity.RunOnUiThread(() =>
            {
                //do something
                  Random reRandom = new Random();
                  int s = reRandom.Next(1000);
                    button.Text = s.ToString();
            });
        }
    
    

관련 자료

  • 이전 Microsoft Teams에서 임시 그룹 채팅을 만들 때 채팅 기록 표시 안 함
  • 다음 python - 날짜 값을 가진 요소 별 최대 값