السلام عليكم ورحمة الله وبركاته ،

لدي تطبيق أندرويد ، أضفت له CheckBox داخل menu ، وأضفت له أيضًا SharedPreferences ؛ حتى إذا وضع المستخدم علامة صح على الـ CheckBox يحفظ الاختيار مباشرة داخل الـ SharedPreferences .

الـ CheckBox بعد وضع علامة صح عليه يتم تغيير ثيم التطبيق مباشرة ، وإذا أزال الصح يرجع ثيم التطبيق الأصلي ، ويتم حفظ اختيارات المستخدم هذه داخل الـ SharedPreferences كما قلت سابقًا .

مشكلتي هي :

عندما يتم الضغط على الـ CheckBox تظهر علامة الصح ، ولا يتغير ثيم التطبيق ، وعند الضغط من جديد على الـ CheckBox تذهب العلامة ويتغير الثيم ، وعند الضغط مرة أخرى يبقى الثيم كما هو لا يرجع للأصلي ! لكن الـ SharedPreferences يعمل بدون أي مشاكل في حفظ القيم ، يا true أو false .

طبعًا المشكلة داخل كلاس MainActivity في دالة onOptionsItemSelected


  • ملف main_menu.xml :

<menu xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">

<item
    android:id="@+id/theme_checkbox"
    android:title="@string/share"
    android:icon="@drawable/ic_action_share"
    android:orderInCategory="3"
    app:showAsAction="never"
    android:actionViewClass="android.widget.CheckBox"
    android:checkable="true" />

  • كلاس MainActivity :

...

public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener, View.OnClickListener {

CheckBox themeCheckBox;

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

    themeCheckBox = (CheckBox) findViewById(R.id.theme_checkbox);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.theme_checkbox:
            item.setChecked(!item.isChecked());

            item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    if (item.isChecked() == true) {
                        item.setChecked(true);
                        ThemeUtils.changeToTheme(MainActivity.this, ThemeUtils.BLACK);
                        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                        prefs.getBoolean("BlackTheme", false);
                        SharedPreferences.Editor editor = prefs.edit();
                        editor.putBoolean("BlackTheme", true);
                        editor.commit();
                        return true;
                    } else if (item.isChecked() == false) {
                        item.setChecked(false);
                        ThemeUtils.changeToTheme(MainActivity.this, ThemeUtils.STOCK);
                        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                        SharedPreferences.Editor editor = prefs.edit();
                        editor.putBoolean("BlackTheme", false);
                        editor.commit();
                    }
                    return false;
                }
            });
            return true;
    }
    return super.onOptionsItemSelected(item);
}

}


  • كلاس ThemeUtils :

...

import android.app.Activity; import android.content.Intent;

public class ThemeUtils {

public static int cTheme;
public final static int STOCK = 0;
public final static int BLACK = 1;

public static void changeToTheme(Activity activity, int theme) {
    cTheme = theme;

    activity.finish();

    activity.startActivity(new Intent(activity, activity.getClass()));
}

public static void onActivityCreateSetTheme(Activity activity) {
    switch (cTheme) {
        case STOCK:
            activity.setTheme(R.style.AppTheme);
            break;

        case BLACK:
            activity.setTheme(R.style.BlackTheme);
            break;

    }

}

}


  • ملف styles.xml :
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">#0ABEF5</item>
    <item name="colorPrimaryDark">#1EA9D4</item>
    <item name="android:navigationBarColor">#1EA9D4</item>
</style>

<style name="BlackTheme" parent="Theme.AppCompat.Light.DarkActionBar"></style>