2017-04-06 81 views
1

我的活動中有一個切換按鈕。當開關打開時,它顯示啓用對話框並且開關關閉,它顯示禁用對話框。在取消對話框中恢復切換按鈕的狀態

((SwitchCompat) findViewById(R.id.toggleButton)).setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on"); 
       showEnableSharingDialog(); 
      } else { 
       ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off"); 
       showDiasableShareingDialog(); 
      } 
     } 
    }); 

這是使對話框:

private void showEnableShareingDialog() { 
    final CharSequence options[]= getResources().getStringArray(R.array.sharing_options); 
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this); 

    builder.setTitle(getString(R.string.you_want_to_enable_prev_sigtings)); 

    builder.setItems(options, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if(which==0){ 
       mShareSigtings=true; 
       mEnableShareing=true; 
       updateSettings(); 
      } else if(which==1){ 
       mShareSigtings=true; 
       mEnableShareing=false; 
       updateSettings(); 
      } else { 
       /*---todo---*/ 
       dialog.cancel(); 
      } 
     } 
    }); 
    builder.show(); 
} 

這是禁用的對話框:

private void showDiasableShareingDialog() { 
    final CharSequence options[]= getResources().getStringArray(R.array.remove_sharing_options); 
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this); 

    builder.setTitle(getString(R.string.you_want_to_remove_prev_sigtings)); 

    builder.setItems(options, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == 0) { 
       mShareSigtings = false; 
       mRemovePrevSigtings = true; 
       updateSettings(); 
      } else if (which == 1) { 
       mShareSigtings = false; 
       mRemovePrevSigtings = false; 
       updateSettings(); 
      } else { 
       /*---todo---*/ 
       dialog.cancel(); 
      } 
     } 
    }); 
    builder.show(); 
} 

在這兩個對話框,切換按鈕開關實施國家即說撥動是ON狀態,那麼我按下按鈕,彈出對話框,當我按下CANCEL時,它將從ON變爲OFF狀態。預期的結果是當按下CANCEL時,切換按鈕應保持在其原始位置,即如果切換爲ON,則在按下CANCEL時它應保持ON。我將如何實現這種操作?

此外,如果我做下面的事情,兩個對話框不斷彈出按下CANCEL。

if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){ 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 
}else { 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 
} 
+0

您的setOnChangeListener條件引起的問題。當通過.setChecked編程切換開關的代碼被調用時,它被觸發。 –

回答

1

你必須知道:

  • onCheckedChanged被調用後的SwichCompat的狀態變化。
  • 如果添加了OnCheckedChangeListener您SwitchCompat,這個監聽器將(通過代碼或通過手動按下)

所以,快速修復此的SWICH狀態的任何更改後觸發的,在你面前將swich set null的檢查狀態更改爲onCheckedChanged,然後再次放置偵聽器。這裏有一個例子:

SwitchCompat mySwich = ((SwitchCompat) findViewById(R.id.toggleButton)) 
    OnCheckedChangeListener listener = new OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if(isChecked){ 
         ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on"); 
         showEnableSharingDialog(); 
        } else { 
         ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off"); 
         showDiasableShareingDialog(); 
        } 
       } 
      }; 
mySwitch.setOnCheckedChangeListener(listener); 

並在您取消回調,你可以做這樣的事情:當你設置開關切換

mySwitch.setOnCheckedChangeListener(null); 
if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){ 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 
}else { 
        ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 
} 
mySwitch.setOnCheckedChangeListener(listener); 
+0

感謝您的幫助這樣做解決了我的問題 – Raj

+0

好,然後讓它成爲一個公認的答案:) –

0

else { 
 
    /*---todo---*/ 
 
    dialog.cancel(); 
 
}

每個那些其他代碼上面標誌着取消其落在 「別人」 爲你的情況採取行動 - 您可以添加

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false); 

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true); 

以下/ ---待辦事項--- /評論和恰好在您之前dialog.cancel();

+0

我是否必須將它添加到對話框或其中的任何一個? – Raj

+0

@Raj嘗試一個或兩個。 –

+0

我試着按照你說的,事實證明它失敗的條件之一取決於你把它放在哪裏也對話顯示兩次 – Raj