السلام عليكم ورحمة الله وبركاته ،
لدي تطبيق أندرويد ، أضفت له CheckBox داخل menu ، وأضفت له أيضًا SharedPreferences ؛ حتى إذا وضع المستخدم علامة صح على الـ CheckBox يحفظ الاختيار مباشرة داخل الـ SharedPreferences .
الـ CheckBox بعد وضع علامة صح عليه يتم تغيير ثيم التطبيق مباشرة ، وإذا أزال الصح يرجع ثيم التطبيق الأصلي ، ويتم حفظ اختيارات المستخدم هذه داخل الـ SharedPreferences كما قلت سابقًا .
مشكلتي هي :
عندما يتم الضغط على الـ CheckBox تظهر علامة الصح ، ولا يتغير ثيم التطبيق ، وعند الضغط من جديد على الـ CheckBox تذهب العلامة ويتغير الثيم ، وعند الضغط مرة أخرى يبقى الثيم كما هو لا يرجع للأصلي ! لكن الـ SharedPreferences يعمل بدون أي مشاكل في حفظ القيم ، يا true أو false .
طبعًا المشكلة داخل كلاس MainActivity في دالة onOptionsItemSelected
- ملف main_menu.xml :
<menu xmlns:android="
"
xmlns:app="
http://schemas.android.com/... " xmlns:tools=" http://schemas.android.com/... " 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>