-1

Я написал программу, в которой я использую Timer и управляю этим таймером, используя состояния Toggle.Ручка ToggleButton in onResume()

Toggle's состояние по умолчанию OFF после того, как внести изменения в состоянии переключения из OFF в ONTimer начинается, и когда я снова изменится на OFF он останавливает Timer согласно требованию.

Но проблема начинается тогда, когда мой Timer является ON и переключиться на другую деятельность, а затем снова come back к ToggleActivity, а затем сделать изменения в состоянии переключения от ON к OFF - он по-прежнему работает Timer ...

Примечание:, когда я использую finish() или back пресс, вместо Intent, чтобы вернуться к ToggleActivity все работает отлично, но когда я использую Intent облицовочные такие вопросы ..

ToggleActivity.java:

public class ToggleActivity extends Activity implements OnCheckedChangeListener { 

    ToggleButton toggleButton; 
    TextView text; 

    Timer timer; 
    TimerTask timerTask; 
    final Handler handler = new Handler(); 

    Button btnSwitchActivity; 

    boolean toggleState; 
    SharedPreferences sharedPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     setContentView(R.layout.activity_toggle);   

     toggleButton = (ToggleButton) findViewById(R.id.toggleButton); 
     text = (TextView) findViewById(R.id.textView1); 
     btnSwitchActivity = (Button) findViewById(R.id.btnSwitchActivity); 

     sharedPreferences = getApplicationContext().getSharedPreferences("toggleState",0); 

     btnSwitchActivity.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent intentSwitchActivity = new Intent(ToggleActivity.this, SwitchActivity.class); 
       startActivity(intentSwitchActivity); 
       } 
      }); 

     } 

     @Override 
     public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {  

      if(isChecked) 
      {    
       SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putBoolean("toggleState", true); 
       editor.commit(); 

       text.setText("ON"); 

       startTimer(); 

      } else 
      {  

       SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putBoolean("toggleState", false); 
       editor.commit(); 

       text.setText("OFF"); 

       if (timer != null) { 
        timer.cancel(); 
        timer = null; 
       } 
      } 

     } 


     public void startTimer() { 

      timer = new Timer();    
      initializeTimerTask();   
      timer.schedule(timerTask, 1000, 5000); 

     } 

     public void stoptimertask(View v) { 

      if (timer != null) { 
       timer.cancel(); 
       timer = null; 
      } 

     } 

     public void initializeTimerTask() { 

      timerTask = new TimerTask() { 

       public void run() { 

        handler.post(new Runnable() { 

         public void run() { 
          Calendar calendar = Calendar.getInstance(); 
          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd:MMMM:yyyy HH:mm:ss a"); 
          final String strDate = simpleDateFormat.format(calendar.getTime()); 

          int duration = Toast.LENGTH_SHORT; 
          Toast toast = Toast.makeText(getApplicationContext(), strDate, duration); 
          toast.show(); 
         } 

        }); 

       } 

      }; 

     } 

     public void onResume() { 
      super.onResume(); 

      toggleState = sharedPreferences.getBoolean("toggleState", false); 
      Log.v("toggleState", Boolean.toString(toggleState)); 

      if (toggleState) { 
       toggleButton.setChecked(true); 
       text.setText("ON"); 
      } else { 
       toggleButton.setChecked(false); 
       text.setText("OFF"); 
      } 

      toggleButton.setChecked(toggleState); 
      toggleButton.setOnCheckedChangeListener(this);   
     } 

     @Override 
     protected void onPause() { 
      super.onPause();    
      toggleButton.setOnCheckedChangeListener(null); 
      } 

} 

SwitchActivity.java

public class SwitchActivity extends Activity { 

    Button btnToggleActivity; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_switch); 

     btnToggleActivity = (Button) findViewById(R.id.btnToggleActivity); 
     btnToggleActivity.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent intent = new Intent(SwitchActivity.this, ToggleActivity.class); 
       startActivity(intent); 

       /** 
       * if i use finish instead of Intent to switch to ToggleActivity 
       * my Timer works fine 
       */ 
       // finish 
      } 
     }); 
    }  
} 

activity_toggle.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:gravity="center" 
    android:background="#ffffff" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context=".ToggleActivity" > 

    <ToggleButton 
     android:id="@+id/toggleButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/toggle_selector" 
     android:checked="false" 
     android:text="" 
     android:textOff="" 
     android:textOn="" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:layout_marginTop="20dp" 
     android:layout_marginBottom="20dp" 
     android:text="@string/string_toggle_off" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <Button 
     android:id="@+id/btnSwitchActivity" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/string_btn_switch"/> 

</LinearLayout> 

activity_switch.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:background="#ffffff" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/btnToggleActivity" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/string_btn_goback" 
     /> 

</LinearLayout> 
+0

Выполняет ли 'setText' корректно (т. Е. Как вы ожидали бы время), или делает это неправильно, как это делает время? –

+0

@NeilTownsend проверить мой обновленный код и экраны – Sun

+0

Есть ли причина, по которой вы не хотите использовать финиш?Казалось бы, это правильный подход в отсутствие веской причины. –

ответ

3

«Но проблема начинается, когда мой таймер включен, и я переключаюсь на другую активность, а затем снова возвращаюсь к активности Toggle «...

Вы не вернетесь. Как сказал @Fabin Paul, вы просто создаете новый экземпляр ToggleActivity. Таким образом, в случае, когда вы запускаете приложение, а затем перейти к SwitchActivity и обратно, нажав на кнопку, то back stack выглядит следующим образом:

ToggleActivity(1) -> SwitchActivity -> ToggleActivity(2)

»... а затем сделать изменения в состоянии переключения от ON до OFF - он все еще запускает таймер ... »

Вы выключаете таймер второго экземпляра ToggleActivity. Тот, который работает, принадлежит первому экземпляру ToggleActivity.

«когда я использую покрытие() или назад нажмите, вместо Намерения вернуться к ToggleActivity все работает отлично ...»

Да, это так, потому что вы не создать второй экземпляр ToggleActivity, и ваша логика работает правильно.

Самый простой способ получить желаемое поведение - добавить android:launchMode="singleInstance" в тег ToggleActivity манифеста.

+1

Это основная проблема. Я бы добавил, что другим решением было бы использовать финиш, как вы заметили в обновленном вопросе. –

+1

@ Оник невероятный :) ты мастер .. спасибо всем, кто мне помог – Sun

-1

здесь вы звоните setChecked(true) означает onCheckedChangeListener позвонит, то обновление предпочтения также, вы должны удалить слушателя и установить слушателя на кнопку переключения, например:

toggleMap.setOnCheckedChangeListener(null); 
toggleMap.setChecked(isChecked); 
toggleMap.setOnCheckedChangeListener(this); 

EDIT

@Override 
     protected void onResume() { 
      super.onResume(); 

      tg1pref = preferences.getBoolean("tg1pref", false); 
      toggleMap.setOnCheckedChangeListener(null); 
      toggleMap.setChecked(tg1pref); 
      toggleMap.setOnCheckedChangeListener(this); 

       if (!tg1pref) { 
        if (timer != null) { 
         timer.cancel(); 
          timer = null; 
         } 
       } 
} 

и

@Override 
    protected void onPause() { 
     toggleMap.setOnCheckedChangeListener(null); 
     super.onPause(); 
    } 
+0

, пожалуйста, проверьте мой опубликованный код, по-прежнему получая такую ​​же проблему. – Sun

+0

Я отредактировал свой ответ, проверьте его. –

+0

все еще не работает, даже не сохраняя состояние переключателя bro – Sun

-1

Присвоить прослушиватель кнопке переключения после проверки состояния.

Просто удалите:

toggleMap.setOnCheckedChangeListener(this); 

линии в onCreate и добавьте ту же строку в onResume после обновления статуса.

toggleMap.setOnCheckedChangeListener(this); 

и onPause():

toggleMap.setOnCheckedChangeListener(null); 

так:

@Override 
protected void onResume() { 
    super.onResume(); 

    tg1pref = preferences.getBoolean("tg1pref", false); 
    if (!tg1pref) { 
     if (timer != null) { 
      timer.cancel(); 
      timer = null; 
     } 
    } 
    toggleMap.setChecked(tg1pref); 
    toggleMap.setOnCheckedChangeListener(this); 
} 

и:

@Override 
protected void onPause() { 
    super.onPause(); 
    toggleMap.setOnCheckedChangeListener(null); 
} 
+0

это сработало? –

+0

Я запутался, вы можете показать мне, где я должен положить onResume() и почему в onPause()? – Sun

+0

Это сработало, сначала скажите мне, тогда я объясню сценарий. –

0

Когда ToggleActivity переходит в состояние , это Безразлично Отменить запуск Timer. Вам нужно отменить его вручную.

Вы можете добавить следующий фрагмент кода в вашем методе onPause():

if (timerTask != null) 
    timerTask.cancel(); 
if (timer != null) { 
    timer.cancel(); 
    timer = null; 
} 
+0

, но я не хочу отменять таймер – Sun

+0

, но вы сказали: он продолжает работать, это ваша проблема? – TheLittleNaruto

+0

снова прочитайте мой вопрос – Sun

0

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

я получил вокруг проблемы путем таймера статического

static Timer timer; 

и запуск только один экземпляр таймера

public void startTimer() { 
    if (timer == null) { 
     timer = new Timer(); 
     initializeTimerTask(); 
     timer.schedule(timerTask, 1000, 5000); 
    } 
} 

Я надеюсь, что это помогает ...

+0

проверить мой обновленный код и экраны – Sun

+0

'если (toggleState) { \t \t \t toggleButton.setChecked (истина); \t \t \t text.setText ("ON"); \t \t} else { \t \t \t text.setText ("OFF"); \t \t \t toggleButton.setChecked (false); \t \t} '' –

+0

Пожалуйста, проверьте, если он работал ... –