Tôi thực sự có tính năng này trong ứng dụng của mình và bổ sung, tôi cho phép người dùng thay đổi chủ đề khi chạy. Khi đọc một giá trị từ các sở thích mất một thời gian, tôi nhận được một id chủ đề thông qua chức năng truy cập toàn cầu giữ giá trị được lưu trữ.
Như đã được chỉ ra - tạo một số chủ đề Android, sử dụng this guide. Bạn sẽ có ít nhất hai mục <style>
trong tệp styles.xml
của mình. Ví dụ:
<style name="Theme.App.Light" parent="@style/Theme.Light">...</style>
<style name="Theme.App.Dark" parent="@style/Theme">...</style>
Bây giờ, bạn phải áp dụng một trong các kiểu này cho hoạt động của mình. Tôi đang làm điều này trong phương pháp activitie của onCreate
, trước bất kỳ cuộc gọi khác:
setTheme(MyApplication.getThemeId());
getThemeId
là một phương pháp mà trả về cache ID chủ đề:
public static int getThemeId()
{
return themeId;
}
lĩnh vực này đã được cập nhật bởi một phương pháp khác:
public static void reloadTheme()
{
themeSetting = PreferenceManager.getDefaultSharedPreferences(context).getString("defaultTheme", "0");
if(themeSetting.equals("0"))
themeId = R.style.Theme_Light;
else
themeId = R.style.Theme_Dark;
}
Được gọi bất cứ khi nào tùy chọn được thay đổi (và, khi khởi động khóa học). Hai phương pháp này nằm trong lớp MyApplication
, mở rộng Application
. Trình nghe thay đổi tùy chọn được mô tả ở cuối bài đăng này và nằm trong lớp hoạt động chính.
Điều cuối cùng và khá quan trọng - chủ đề được áp dụng, khi một hoạt động bắt đầu. Giả sử, bạn chỉ có thể thay đổi chủ đề trong màn hình ưu tiên và chỉ có một cách để đến đó, tức là chỉ từ một hoạt động chính, hoạt động này sẽ không được khởi động lại khi bạn thoát khỏi màn hình ưu tiên. đã sử dụng. Đây là bản vá cho rằng (khởi động lại hoạt động chính của bạn):
@Override
protected void onResume() {
super.onResume();
if(schduledRestart)
{
schduledRestart = false;
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
}
scheduledRestart
là một biến boolean, bước đầu thiết lập là false. Đó là thiết lập là true khi chủ đề được thay đổi bởi người nghe này, mà cũng cập nhật ID chủ đề cache đã đề cập trước:
private class themeListener implements OnSharedPreferenceChangeListener{
@Override
public void onSharedPreferenceChanged(SharedPreferences spref, String key) {
if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting()))
{
MyApplication.reloadTheme();
schduledRestart = true;
}
}
sp = PreferenceManager.getDefaultSharedPreferences(this);
listener = new themeListener();
sp.registerOnSharedPreferenceChangeListener(listener);
Nhớ giữ một tham chiếu đến đối tượng người nghe, nếu không nó sẽ Colleted rác (và sẽ không còn làm việc).
Câu trả lời tuyệt vời, cảm ơn rất nhiều! –
Tôi nghĩ rằng tôi có thể giải quyết mà không mở rộng ứng dụng, nhưng vấn đề là 'getApplicationInfo(). Chủ đề' không được cập nhật nếu tôi làm một' getApplication(). SetTheme (myThemeId) '... vì vậy có, cách của bạn là chính xác . – vault
Có vẻ như có phương pháp khởi động lại hoạt động đơn giản hơn trong những ngày này: 'recreate' (https://developer.android.com/reference/android/app/Activity.html#recreate%28%29). – BlueMonkMN