2012-12-03 51 views
0

嗨我遇到了「保存我的複選框狀態」的問題。在我的情況下:檢查狀態 - 啓用聲音,取消選中狀態 - 禁用它們。在我的options.xml我被設置:在啓動應用程序時保存「檢查」複選框狀態

<CheckBox 
android:id="@+id/bbutton_sound" 
android:layout_width="match_parent"  
android:layout_height="wrap_content"  
android:text="@string/ebsound"  
android:layout_marginTop="20.00dp"  
android:checked="true"/> 

問題是,當我取消選中選項checbox。退出應用程序並再次輸入後,所有聲音都被啓用(這是正確的),但複選框保持未選中狀態(應該返回到檢查狀態)。我不知道如何實現這一點。我試圖通過ondestroy方法強制「檢查狀態」,但沒有任何幫助。這是我的java代碼:

package com.Pong; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.Toast; 

public class Options extends Activity { 
    private CheckBox bbutton_sound; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.options); 
    addListenerOnButton(); 
    bbutton_sound.setChecked(true); 
    final MediaPlayer mpButtonClick = MediaPlayer.create(this, R.raw.menu_button_sound); 
    Button BackButton = (Button)findViewById(R.id.Back); 
    BackButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      Intent MenuIntent = new Intent(Options.this,Menu.class); 
      Options.this.finish(); 
      startActivity(MenuIntent); 
      mpButtonClick.start(); 
     } 
    }); 

    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     save(bbutton_sound.isChecked()); 

    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     bbutton_sound.setChecked(load()); 
    } 

    private void save(final boolean isChecked) { 
     SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean("check", isChecked); 
     editor.commit(); 
    } 

    private boolean load() { 
     SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
     return sharedPreferences.getBoolean("check", true); 
    } 

    public void addListenerOnButton() { 
     bbutton_sound = (CheckBox) findViewById(R.id.bbutton_sound); 
     bbutton_sound.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     if (((CheckBox) v).isChecked()) { 
      AudioManager volumeControl = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
      volumeControl.setStreamMute(AudioManager.STREAM_MUSIC, false); 
      int maxVolume = volumeControl.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
      volumeControl.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, maxVolume); 

      Toast.makeText(Options.this, 
       "Sounds enabled", Toast.LENGTH_LONG).show(); 
     } else if (((CheckBox) v).isChecked()==(false)){ 
      AudioManager volumeControl = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
      volumeControl.setStreamMute(AudioManager.STREAM_MUSIC, true); 
      Toast.makeText(Options.this, 
         "Sounds disabled", Toast.LENGTH_LONG).show(); 
     } 
     } 
    }); 

    } 
} 

謝謝你的幫助。

+0

我想你的複選框是未選中的,因爲這是他保存在SharedPreferences中的最後一個狀態,所以代碼工作正常。也許你應該擴展Application類並將你的屬性保存在SharedPreferences中爲true或者只是在Application.onCreate()方法中刪除它。之後,每次您的應用程序將啓動您的按鈕應該已被檢查。 – fgeorgiew

回答

0

當你回到你的設置被保存,所以當你啓動應用程序時,它的值取消選中。

試試這個:如果你使用內置的XML首+活動/片段框架

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.remove("check"); 
    editor.commit(); 
} 
+0

哇這個作品,但正如你可以看到我回到了按鈕,這導致我進入主菜單。這會自動完成選項活動並啓動一個菜單。 「選項」是菜單活動的一部分,當我在選項活動中設置了onDestroy()方法並且未選中框時,下次我輸入選項時(無需退出),我將收到對話框。我在想的是我的應用程序包含菜單之前的「閃屏」活動。如果我在該活動中使用onDestroy方法,它會工作得很好,但我怎樣才能做出參考? – NightKn8

+0

替換editor.remove(「check」); for editor.putBoolean(「check」,true);在onDestroy並看看! – Ascension

+0

這不起作用。我上面提到的效果相同。我也嘗試調用「putBoolean(」check「,true);」在我的閃屏活動中,但是甚至沒有發生,或者我不知道如何實現它。 – NightKn8

0

你的選項/菜單設置可能會更易於使用和調試。您可以使用預先構建的CheckBoxPreference,並始終從關聯的已保存首選項中獲取其檢查狀態。 http://developer.android.com/guide/topics/ui/settings.html

在res/XML:

<CheckBoxPreference 
     android:key="@string/pref_sounds_key" 
     android:title="@string/pref_sounds_title" 
     android:summary="@string/pref_sounds_summary" 
     android:persistent="true" 
     android:enabled="true" 
     android:defaultValue="false" 
    /> 

在你的活動:

public boolean getPreferenceSounds() { 
    String key = getString (R.string.pref_sounds_key); 
    boolean result = getSharedPreferences().getBoolean (key, false); 

    return result; 
} 

public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, 
    String key) { ... } 
+0

也注意到你正在使用onClickListener(View)作爲你的CheckBox - 如果你要走這條路線,最好使用[onCheckedChangeListener(CompoundButton,boolean)](http://developer.android.com/reference/android/widget /CompoundButton.OnCheckedChangeListener.html)。 – MandisaW

1

嗨對不起已故的答覆,但我找到了一種方法來去除不必要的檢查:)。這是一種騙局,因爲我所要做的就是在IntroGame活動的onCreate方法中移除該狀態,這是我遊戲中的第一個活動,不能被忽略:)。

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.remove("check"); 
    editor.commit(); 

謝謝你的幫助和興趣!