2015-04-08 1 views
0

В моей основной деятельности есть фоновая музыка, и я хочу остановить ее, когда смогу, с помощью флажка. У меня уже есть коды, чтобы установить фоновую музыку в основную деятельность, и она отлично работает. Проблема в том, что я хочу остановить определенную песню из другого действия с помощью CheckBox. Я настроил флажок, однако он не работает. Некоторая помощь действительно оценена.Чтобы остановить фоновый звук от 1-го действия до другого, используя флажок?

PD: Общение между этими двумя видами деятельности хорошо работает. Это флажок, который не работает

Вот мои используемые коды.

MainActivity.java

`

public class MainActivity extends Activity implements View.OnClickListener { 
    MediaPlayer bkgrdmsc; 
    private int lmusic_checked = SettingsActivity.music_checked; 

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

if (lmusic_checked == 0){ 
     bkgrdmsc = MediaPlayer.create(MainActivity.this, R.raw.backgroundmusic); 
     bkgrdmsc.setLooping(true); 
     bkgrdmsc.start(); 

    } 
@Override 
protected void onPause() { 
    if (lmusic_checked == 0){ 
     bkgrdmsc.release(); 
    } 
    SettingsActivity.music_checked =0; 
    super.onPause(); 
    bkgrdmsc.release(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    //inflate the menu; this adds items to the action bar if this is present 
    super.onCreateOptionsMenu(menu); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_settings) { 
     Intent s_intent = new Intent(this, SettingsActivity.class); 
     startActivity(s_intent); 
     return true; 
    } 
    else if (id == R.id.logo_home){ 
     Intent t_intent = new Intent(this, Twitter.class); 
     startActivity(t_intent); 
     return true; 
    } 


    return super.onOptionsItemSelected(item); 

} 

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:weightSum="1"> 

    <TextView 
     android:layout_width="271dp" 
     android:layout_height="77dp" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="@string/c_general" 
     android:id="@+id/textView" 
     android:layout_gravity="center_vertical" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="57dp" 
     android:textSize="26dp" /> 

    <CheckBox 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/turn_on_music" 
     android:id="@+id/CheckBox" 
     android:layout_below="@+id/textView" 
     android:layout_centerHorizontal="true" 
     android:checked="false" 
     android:singleLine="false" 
     android:textColor="#000000" /> 
</RelativeLayout> 

SettingsActivity.java

package com.example.json.publicomidas; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 




public class SettingsActivity extends Activity { 

public static int music_checked= 0; 


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

    music_off(); 
} 
public void music_off(){ 
    CheckBox checkBox1 = (CheckBox) findViewById(R.id.CheckBox); 
    checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (buttonView.isChecked()) { 

       music_checked = 1; 
      } else { 
       music_checked = 0; 
      } 
     } 
    }); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    //inflate the menu; this adds items to the action bar if this is present 
    super.onCreateOptionsMenu(menu); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_settings, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.home) { 
     Intent s_intent = new Intent(this, MainActivity.class); 
     startActivity(s_intent); 

     return true; 

    } 
    return super.onOptionsItemSelected(item); 

    } 
} 

ответ

0

Люди, вы не должны делать это таким образом ... Вы не можете сделать два действий связываются друг с другими статическим полем :) При изменении значения music_checked в SetttingsActivity это ничего не меняет в MainActivity.

Мой совет - создать Service, который запускает музыку. Оба действия должны должным образом привязываться к службе и управлять воспроизведением музыки.

Update1

вы реализовали с помощью этого статического поля связи работает только в одном направлении. Вы не можете остановить музыку, изменив свойство music_checked. Это свойство класса SettingsActivity, и экземпляр MainActivity ничего не знает о его состоянии.

Правильный способ реализовать это с помощью Service, который воспроизводит музыку. Неправильно воспроизводить музыку с Activity, если вы хотите, чтобы воспроизведение продолжалось после того, как действие приостановлено/остановлено. Создайте bound service и привяжите каждое действие к службе в своем методе onResume или onStart (и отвяжите в /onStop). Связываясь с сервисом, вы получаете объект, который предоставляет некоторый API (вы должны определить этот API и создать объект в соответствии с функциональными возможностями, которые вы хотите иметь). Используя этот API, вы можете управлять сервисом из обоих действий.

Я советую вам прочитать немного больше о действиях и услугах в Android и их жизненном цикле.

+0

Kiril, я использовал статическое поле на '' 'music_checked = 0;' '' Почему это, потому что я хочу контролировать, когда музыка играет или нет, и даже если я не хочу, чтобы музыка играла. Я устанавливаю '' 'music_checked = 1;' '' – Jason

+0

@ Джейсон, взгляните на мой обновленный ответ, пожалуйста. Не стесняйтесь спрашивать, есть ли что-то непонятное :) –

+0

@ Джейсон, если бы мой ответ помог вам, могу я попросить вас принять его как правильный :) –

Смежные вопросы