按钮图像在 MainActivity.onCreate 内未更改

Button image not changing in MainActivity.onCreate

我有一个静音按钮,可通过 onclick 将我的应用静音。当我 return 到 MainActivity (按钮所在的位置)时,我使用 savedInstanceState 方法保持静音或取消静音应用程序(取决于用户退出时的配置 activity).如果单击按钮并且应用程序处于静音状态,我希望(当我 return 到 MainActivity 时)按钮显示为静音(我有不同的静音和取消静音图像)。

我的代码:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    int defaultValue = getResources().getInteger(R.integer.mutecounterkeydefault);
     mutecounter= sharedPref.getInt(getString(R.string.mutecounterkey), defaultValue);
    mutebb = (ImageButton) findViewById(R.id.muteb);
    if (mutecounter == 1) { 
        mutebb.setImageResource(R.mipmap.muteon);} //this if is not working

    mutebb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MediaPlayerPool.mute = !MediaPlayerPool.mute;
            if (mutecounter == 0) {
                mutebb.setImageResource(R.mipmap.muteon);
                mutecounter = 1;
            } else {
                mutebb.setImageResource(R.mipmap.muteoff);
                mutecounter = 0;
            }
        }
    });
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt(getString(R.string.mutecounterkey), mutecounter);
    editor.apply();

解决方案代码为

 SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    int defaultValue = getResources().getInteger(R.integer.mutecounterkeydefault);
    mutecounter= sharedPref.getInt(getString(R.string.mutecounterkey), defaultValue);
    mutebb = (ImageButton) findViewById(R.id.muteb);
    if (mutecounter == 1) {
        mutebb.setImageResource(R.mipmap.muteon);
        MediaPlayerPool.mute = true;
    }

    mutebb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            if (mutecounter == 0) {
                mutebb.setImageResource(R.mipmap.muteon);
                mutecounter = 1;
                MediaPlayerPool.mute = true;
                        editor.putInt(getString(R.string.mutecounterkey), mutecounter);
            } else {
                mutebb.setImageResource(R.mipmap.muteoff);
                mutecounter = 0;
                MediaPlayerPool.mute = false;
                        editor.putInt(getString(R.string.mutecounterkey), mutecounter);


            }
            editor.apply();


        }
    });

您可以创建一个新的class数据文件,例如:

    public class DataStoreTemporary {

    ////////////////////////////////// INSTANCE //////////////////////////////////
    private static DataStoreTemporary instance = null;

    public static DataStoreTemporary getInstance() {
        if (null == instance) {
            synchronized (DataStoreTemporary.class) {
                if (null == instance) {
                    instance = new DataStoreTemporary();
                }
            }
        }
        return instance;
    }

    //Example//
    private boolean isMute = false;

    public boolean isMute() {
        return isMute;
    }

    public void setMute(boolean mute) {
        isMute = mute;
    }
}

并在您的代码中使用(在 Activity 中):

boolean mute = DataStoreTemporary.getInstance.isMute; //get information
DaraStoreTemporary.getInstance.setMute(mute); //to save the state

如果您不关闭应用程序,这应该可以。

问题是您在调用 OnClickListener 之前保存了 muteCounter

您的代码将设置 onClickListener,然后立即将 muteCounter 保存为当时 mutecounter 持有的任何值,在本例中每次都是 0

你需要做的是:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);

int defaultValue = getResources().getInteger(R.integer.mutecounterkeydefault);    
int mutecounter = sharedPref.getInt(getString(R.string.mutecounterkey), defaultValue);

ImageButton mutebb = (ImageButton) findViewById(R.id.muteb);

if (mutecounter == 1) {
    mutebb.setImageResource(R.mipmap.muteon);
}

mutebb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MediaPlayerPool.mute = !MediaPlayerPool.mute;

        SharedPreferences.Editor editor = sharedPref.edit();

        if (mutecounter == 0) {
            mutebb.setImageResource(R.mipmap.muteon);
            mutecounter = 1;


            editor.putInt(getString(R.string.mutecounterkey), mutecounter);

        } else {
            mutebb.setImageResource(R.mipmap.muteoff);
            mutecounter = 0;

            editor.putInt(getString(R.string.mutecounterkey), mutecounter);
        }

        editor.apply();
    }
});

我们在此处 OnClickListener 中设置要保存到 SharedPreferences 的值,以便在点击按钮时始终设置该值。

这样下次加载视图时,它将在 SharedPreferences 中具有新值。你目前的方式是,你总是将默认值保存到 SharedPreferences,而不是在按下按钮时更新它。

发生这种情况是因为 onClick 方法中的代码仅在单击按钮时执行。 onClick 方法之外的代码会在创建 activity 时立即执行。所以onClick方法所做的更改不会反映在sharedPreference中,因为在调用onClick方法时不会执行保存数据的代码。

解决方案:

像这样将 "saving data to SharedPreferences" 逻辑放在 onClick 方法中。

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE); int defaultValue = getResources().getInteger(R.integer.mutecounterkeydefault); mutecounter= sharedPref.getInt(getString(R.string.mutecounterkey), defaultValue); mutebb = (ImageButton) findViewById(R.id.muteb); 如果(静音计数器== 1){ mutebb.setImageResource(R.mipmap.muteon);} //这个如果不工作

mutebb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MediaPlayerPool.mute = !MediaPlayerPool.mute;
        if (mutecounter == 0) {
            mutebb.setImageResource(R.mipmap.muteon);
            mutecounter = 1;
        } else {
            mutebb.setImageResource(R.mipmap.muteoff);
            mutecounter = 0;
        }
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(getString(R.string.mutecounterkey), mutecounter);
        editor.apply();
    }
});