2

チェックするとすべての音をミュートするはずのこのチェックボックスがあります。アプリを実行してチェックボックスをオフにすると、サウンドがオンになります。次に、ボックスをチェックすると、音がミュートされます! チェックボックスをオフにすると、サウンドはミュートされたままになります。私は何を間違っていますか??

これが私が使用するコードです

public class Settings extends Activity {

CheckBox chb;
boolean m;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);

    final SharedPreferences prefs = this.getSharedPreferences("mute", Context.MODE_PRIVATE);
    m = prefs.getBoolean("mute", false);

    chb = (CheckBox) findViewById(R.id.checkBox1);

    chb.setChecked(m);

    final AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    amanager.setStreamMute(AudioManager.STREAM_MUSIC, m);

    chb.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( buttonView.isChecked() == true )
            {
                m = true;
                amanager.setStreamMute(AudioManager.STREAM_MUSIC, true);

                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("mute", true);
                editor.commit();
            }
            if (buttonView.isChecked() == false)
            {
                m = false;
                System.out.println("unmute");
                amanager.setStreamMute(AudioManager.STREAM_MUSIC, false);

                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("mute", false);
                editor.commit();
            }

        }
    });

}

誰かが役に立つと思った場合に備えて更新します。

特定のストリームのミュート リクエストは累積的です。AudioManager は 1 つ以上のクライアントから複数のミュート リクエストを受け取ることができ、同じ数のミュート解除リクエストが受信された場合にのみ、ストリームのミュートが解除されます。

ユーザー エクスペリエンスを向上させるために、アプリケーションは onPause() でミュートされたストリームのミュートを解除する必要があり、必要に応じて onResume() でミュートが再び行われます。

私の場合、問題は、チェックボックスをオンにすると音がミュートされることでした。設定アクティビティに戻ると、このコードが再度実行されます

final SharedPreferences prefs = this.getSharedPreferences("mute", Context.MODE_PRIVATE);
m = prefs.getBoolean("mute", false);

chb = (CheckBox) findViewById(R.id.checkBox1);

chb.setChecked(m);

final AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
amanager.setStreamMute(AudioManager.STREAM_MUSIC, m);

再び音を消します!したがって、2 つのミュート (累積) があり、2 回ミュートを解除する必要があります。

4

1 に答える 1

0

問題は、ビューが更新される前にリスナーが呼び出されることです。そのため、渡された isChecked を使用する必要があります。onchecked リスナーを次のように切り替えます。

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if (isChecked == true )
            {
                m = true;
                amanager.setStreamMute(AudioManager.STREAM_MUSIC, true);

                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("mute", true);
                editor.commit();
            }
            else
            {
                m = false;
                System.out.println("unmute");
                amanager.setStreamMute(AudioManager.STREAM_MUSIC, false);

                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("mute", false);
                editor.commit();
            }

        }
于 2013-07-22T18:20:11.070 に答える