2

アプリケーションで問題が発生しました。セッションで作成した音楽の再生 (オンまたはオフ) を処理する ToggleButton を持つ「オプション」クラスがあります。ただし、音楽をオフにして画面を変更し、オプション クラスに戻ると、音楽が再生されなくなったにもかかわらず、トグル ボタンが「オン」に戻ります。つまり、音楽を再生するにはボタンを 2 回押す必要があります。実際に戻ってきてください。誰にもアイデアはありますか?

サービス クラス:

public class MyMusicService extends Service {

MediaPlayer mp;


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mp = MediaPlayer.create(this, R.raw.song);


    mp.start();
    mp.setLooping(true);
    return super.onStartCommand(intent, flags, startId);
}


@Override
public IBinder onBind(Intent intent) {

    return null;
}


@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if(mp!=null) {
        mp.stop();
        mp.release();
    }
    mp=null;
}

}

オプションクラス:

public class OptionsActivity extends Activity {

Intent i; // Handles MyMusicService.java
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.options);
    //setting the layout

    i=new Intent(this, MyMusicService.class);
    final ToggleButton soundOption = (ToggleButton) findViewById(R.id.soundPref);

    soundOption.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {   


            // Perform action on clicks to control sound being on and off.   
            if (soundOption.isChecked()) {   
                Toast.makeText(OptionsActivity.this, "Music on.", Toast.LENGTH_SHORT).show();  
                startService(i);  
            } else {   
                stopService(i);
                Toast.makeText(OptionsActivity.this, "Music off.", Toast.LENGTH_SHORT).show(); 
            }  


        }});

}

}

MainActivity クラス

Intent i;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //setting the layout

    //Auto starts playing music on app launch.
    i = new Intent(this,MyMusicService.class);
    startService(i);

私が持っているXMLの事実と関係があるのでしょうか:

android:checked="true"

助けてくれてありがとう。

4

1 に答える 1

0

はい、ToggleButtonこのビューに戻ると、 が新たに初期化されるので、android:checked="true"元に戻ります。

このメソッドmyToggleButton.setChecked(boolean isMusicPlaying)を使用して、ボタンの状態をリセットできます。したがって、このビューに戻って、それに応じてボタンの状態を設定するときに、音楽が再生されているかどうかを確認する必要があります。


別のスレッドで説明されている方法を使用して、音楽サービスが実行されているかどうかを確認できます。

private boolean isMyServiceRunning(String serviceCanonicalClassName) {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceCanonicalClassName.equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

そのため、サービスが実行されていることを確認するために呼び出すだけです。次に、ToggleButton がレイアウト内のどこにあるかを見つけた直後に、トグルするかどうかを定義できます。

boolean musicPlays = isMyServiceRunning(MyMusicService.class.getCanonicalName());
final ToggleButton soundOption = (ToggleButton) findViewById(R.id.soundPref);
soundOption.setChecked(musicPlays)
于 2012-03-22T14:05:42.953 に答える