如何在整个应用程序中关闭切换按钮点击时的声音

4
我有一行代码可以关闭整个应用程序的声音。
<item name="android:soundEffectsEnabled">false</item>

它能正常工作,但我想通过点击切换按钮来开启/关闭声音。

有人建议我如何在运行时为整个应用程序更改主题。

编辑:更新的代码

mToggleBtnSound.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

        boolean on = ((ToggleButton) v).isChecked();
        if (on) {
            // Change Whole App Theme
            MyApplication.changeToTheme(getApplicationContext(), MyApplication.THEME_SOUND_ON);

            //Save state of toggle button yes or no
            MyApplication.getAppliation().getDeviceResourceHandler()
                                    .addToSharedPref(Constant.SHARED_PREF_IS_SOUND_ON, true);

        } else {
            MyApplication.changeToTheme(getApplicationContext(), MyApplication.THEME_SOUND_OFF);

            MyApplication.getAppliation().getDeviceResourceHandler()
                                    .addToSharedPref(Constant.SHARED_PREF_IS_SOUND_ON, false);
        }

       }
  });

将主题更改为应用类
package com.my.app;

import android.content.Context;    
import com.my.app.MyApplication;

public class MyApplication extends Application {

    private static int sTheme;

    public final static int THEME_SOUND_ON = 0;
    public final static int THEME_SOUND_OFF = 1;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static void changeToTheme(Context context, int theme) {
        sTheme = theme;

        switch (sTheme) {
        default:
        case THEME_SOUND_ON:
            context.setTheme(R.style.AppSoundOnTheme);
            break;
        case THEME_SOUND_OFF:
            context.setTheme(R.style.AppSoundOffTheme);
            break;
        }
    }
}

为什么不使用SharedPreferences在用户更改声音按钮时将值设置为“是”,然后无论何时使用声音,都检查声音值是否为“是”?这是持久性的,应该可以正常工作。可能需要一些编码。 - Smashing
我已经完成了这个,请检查更新的问题。 - Garima Mathur
@Garima - 在 setTheme() 后调用 recreate()。 - Pankaj
3个回答

1
您的要求可能需要一个解决方法,即在styles.xml中定义两个主题,一个带有<item name="android:soundEffectsEnabled">false</item>,另一个带有<item name="android:soundEffectsEnabled">true</item> 。然后在切换按钮的setOnCheckedChangeListener方法中,根据您的应用程序主题设置。您可以在此处获取更改主题的实现更改应用程序主题,或者通过在Google上搜索来查找其他大量更改主题的示例。希望这可以帮助你 :)

我尝试了这个解决方案,但它没有起作用。setTheme() 方法在运行时无法更改主题。 - Garima Mathur
你需要重新创建当前活动以应用主题更改。此外,对于后堆栈中的其他活动,您必须完全重新创建堆栈中的活动,才能在其中反映更改。 - Alok Nair
另外,如果您正在使用此技术,则在每个活动中检查使用切换按钮设置的主题首选状态,并在调用setContentView之前在那里初始化相应的主题。 - Alok Nair

1
如果我理解得正确,这应该会对你有所帮助。
ToggleButton tbtn=(ToggleButton)findViewById(id);  
tbtn.setOnCheckedChangeListener(new   CompoundButton.OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // TODO Auto-generated method stub
        if (isChecked) {
            // Sound  is disabled
            tbtn.setSoundEffectsEnabled(false);
        } else {
            // Sound is enabled
            tbtn.setSoundEffectsEnabled(true);
        }
    }
});

用户想要根据切换按钮的状态来禁用整个应用程序的声音效果,而不是像您在这里回答的那样仅针对切换按钮。请在回答之前仔细阅读问题。 - Alok Nair
@Alok 没错,但我们如何实现这一点? - Garima Mathur

0

也许可以尝试以下方法来解决您的问题

public static void changeToTheme(Context context, int theme) {
        sTheme = theme;

        switch (sTheme) {
        default:
        case THEME_SOUND_ON:
            context.setTheme(R.style.AppSoundOnTheme);
            break;
        case THEME_SOUND_OFF:
            context.setTheme(R.style.AppSoundOffTheme);
            break;

        }

       recreate(); //put this line in your code
    }

抱歉,我的错。您需要在切换监听器的onClick方法中的if else条件之后放置recreate()行。 - Pankaj
我已经给你发送了一个示例电子邮件。 - Pankaj
1
谢谢你的回答,我在你的回答之前已经用几乎相同的解决方案进行了修改代码,没有太大的改变! - Garima Mathur
你能帮我回答这个问题吗?请点击这里 - Pankaj
嘿,移动开发者们,有一个非常酷的活动即将举行,请查看此链接:http://tinyurl.com/MobileContest007。 - Pankaj
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接