标签: android-theme

应用程序恢复/重新启动时的 Android 手动暗模式会导致应用程序主题无法正常工作

我在手动管理暗模式时遇到了一个大问题。

该应用程序如何工作

在应用程序启动时,第一个活动会在 SharedPreferences 中检查用户是否选择启用深色模式或保持浅色模式(默认),然后根据用户首选项进行相应更改:

编辑:正如 CSmith 所要求的,这是在活动中调用主题选择器的时间

//FirstActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
...
Run Code Online (Sandbox Code Playgroud)

这是主题选择器方法

//AppThemeSelector.class
    public static void checkAndShowTheme(Context context){
        SharedPreferences sharedPreferences = context.getSharedPreferences(
                PreferencesValues.SHARED_DARKMODE_MAP, Context.MODE_PRIVATE
        );

        boolean darkMode = sharedPreferences.getBoolean(PreferencesValues.SHARED_DARKMODE_ENABLED, false);

        if(darkMode){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }else{
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,每当它启动时,它都会使用用户选择的主题设置主题,并且一切正常。

问题发生在哪里

显然,这个问题似乎只发生在我的小米 Mi A2 Lite (Android 10) 上,因为我已经在 Pixel 2 (Android 11) 和模拟器 (Android 10) 上进行了测试,当应用程序从最近的应用程序恢复时,一切正常普通的。

问题

重现我的问题的一致方法是:假设我的应用程序设置为手动灯光模式,而我的系统处于黑暗模式。我打开应用程序(留在家庭活动或去其他活动会导致相同的问题),然后进入系统设置并更改系统语言。

当我从最近的应用程序选项卡重新打开应用程序时,应用程序似乎尝试重新启动,但中途崩溃了(不确定这一点,因为 logcat 没有显示任何有关崩溃的信息,应用程序也没有显示有关崩溃的任何对话框),并且当它启动时,它会自动设置它的主题到系统主题(所以在我的示例中它进入黑暗模式)。

目前的问题是,一些本来应该在深色模式下看到的文本现在有了浅色模式主题,使它们与黑色背景融为一体;应用程序中用于从深色模式更改为浅色模式的开关保持正确的设置(显示未启用深色模式),但应用程序处于深色模式。如果应用程序重新启动,一切都会恢复正常,并且应用程序会正确显示在浅色主题中。

当应用程序长时间停留在后台时,我无法重现该问题,但我认为它也可能发生。

android android-theme android-dark-theme android-darkmode

4
推荐指数
1
解决办法
3262
查看次数

为什么我的 BottomSheetDialogFragment 忽略我的应用程序主题?

我刚刚开始BottomSheetDialogFragment在我的应用程序中使用 a,但它似乎忽略了我的应用程序主题。我的应用程序使用深色主题,并且BottomSheetDialogFragment 显示为白色背景,并且不使用我的应用程序的强调色。这是唯一具有这种行为的 Android 组件。为什么会这样以及如何解决这个问题?

public class CustomBottomDialogFragment extends BottomSheetDialogFragment {

    public static CustomBottomDialogFragmentnewInstance(long id) {
        final CustomBottomDialogFragmentdialog = new CustomBottomDialogFragment();
        Bundle args = new Bundle();
        args.putLong(Keys.ARG1, id);
        dialog.setArguments(args);
        return dialog;
    }

  @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final long id = getArguments().getLong(Keys.ARG1);
        final boolean isLiveStream = PodcastHelper.isLiveStream(podcastId);
        final View view = inflater.inflate(R.layout.custom_bottom_sheet_layout, container, false);

...

        return view;
    }
Run Code Online (Sandbox Code Playgroud)

android android-theme bottom-sheet bottomsheetdialogfragment

4
推荐指数
1
解决办法
2443
查看次数

Android样式/仅搜索对话框的主题

tl; dr:应用主题中的白色文本样式由搜索对话框拾取,使搜索文本不可见.

我正在努力解决看似微不足道的问题.

我的应用程序使用的是深色背景,我使用#EEEEEE将文本颜色调整为比标准灰色更亮.

我已经实现了一个搜索对话框(pre-Honeycomb)并且运行良好,但搜索对话框中的文本选择了相同的#EEEEEE,因此它基本上是不可见的.即使我长按搜索文本时显示的上下文菜单也会选择#EEEEEE,因此该文本也是不可见的.

我正在撕扯我的头发,而且我的头发已经用完了.

样式:

<style name="master" paret="@android:style/Theme.NoTitleBar">
    <item name="android:textColor">#EEEEEE</item>
    <item name="android:windowNoTitle">true</item>        
</style>
Run Code Online (Sandbox Code Playgroud)

表现:

<application android:icon="@drawable/icon"
             android:label="@string/app_label"
             android:theme="@style/master"
             android:hardwareAccelerated="true"
             android:debuggable="true"> 
Run Code Online (Sandbox Code Playgroud)

android android-searchmanager android-theme

3
推荐指数
1
解决办法
2382
查看次数

主题更改时缺少操作栏

我正在尝试在运行时更改应用程序主题,所以我将android:theme标签添加到我的清单文件中,将其从Holo更改为Holo.Light并且我工作,唯一的事情是操作栏没有显示与新主题

有人可以告诉我我错过了什么,谢谢

<application android:label="@string/app_name"
             android:icon="@drawable/ic_launcher"
             android:theme="@style/AppTheme">
Run Code Online (Sandbox Code Playgroud)

[更新]按要求添加了AppTheme

<resources>

    <style name="AppTheme" parent="android:Theme.Light" />

</resources>
Run Code Online (Sandbox Code Playgroud)

android android-theme

3
推荐指数
1
解决办法
3013
查看次数

Android TextView样式

我正在尝试为TextView控件设置样式.我可以添加用户定义的样式或系统样式.但我不能为我的TextView设置两者.我想显示像按钮样式的TextView,我必须添加宽度和高度.我的布局代码是:

<TextView
    android:id="@+id/trans_payable"
    <-- style="@android:style/Widget.Button" -->
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="left"
    android:clickable="true"
    android:paddingLeft="10sp"
    android:paddingTop="20sp"
    android:paddingRight="50sp"
    style="@style/transactionbtn"
    android:text="@string/trans_payable" >
</TextView>
Run Code Online (Sandbox Code Playgroud)

我的style.xml代码是:

<style name="transactionbtn">
    <item name="android:width">140dp</item>
    <item name="android:height">45dp</item>
    <-- How to add button style here -->
</style>
Run Code Online (Sandbox Code Playgroud)

android android-ui android-layout android-theme

3
推荐指数
1
解决办法
1万
查看次数

在Android Manifest中更改主题会导致应用程序崩溃 - 简单的解决方案?

我在旧版本的Eclipse中创建了一些应用程序.这样做时,我会输入:

机器人:主题= "@安卓风格/ Theme.Black.NoTitleBar.Fullscreen"

在清单文件中,这总是改变了应用程序主题没有问题.最近,我开始使用花哨的新Java-ADT Eclipse程序,当我将上述语句输入清单文件时,应用程序崩溃了.我的意思是当我插入一个设备来测试应用程序(无论是我的Galaxy II,Galaxy 4或Galaxy Tab 3 10.1)时,应用程序安装正确(Eclipse没有错误并声称一切都成功),但是设备应用程序加载一个空的黑屏,然后很快崩溃,并显示消息"不幸的是,(app)已经停止".我错过了什么吗?

以下是一些需要注意的事项:

  • 生成的应用程序是黑色的,没有标题或通知栏(在崩溃之前),当我将主题短语更改为相同的东西时,例如,"全屏"它正确显示带有通知栏但没有标题栏的黑屏(之前)崩溃).对我来说,这表明我正在进入的这个词仍然是今天的标准,也许所需的改变/修改在其他地方.

  • 如果我启动一个新项目并运行它,"Hello World"应用程序将在我的所有设备上正确显示,但如果我将清单文件中的默认主题(android:theme ="@ style/AppTheme")更改为任何其他主题,应用程序崩溃("不幸的是,应用已经停止").

  • 我尝试通过不同的路径来覆盖它:我在res-values-styles文件中输入了一系列短语(手动应用"NoTitle"和"Fullscreen"属性的项目),但这仅适用于我的Galaxy 4和Tab 3 10.1(我的Galaxy II仍显示标题).此应用程序是白色的,而不是黑色.

在这一点上的任何建议将是一个很大的帮助!谢谢

eclipse crash android android-manifest android-theme

3
推荐指数
1
解决办法
5200
查看次数

更改活动主题而不重新创建活动

我有活动。在按钮上单击,我想更改主题,但是到处都发现,该主题只能设置一次,而在setContentView之前也可以设置。重新启动活动不是我的选择。也许使用attrs必须解决此问题。但是我不知道如何使用它。请帮忙!!

提前致谢!!

android android-theme declare-styleable

3
推荐指数
1
解决办法
1840
查看次数

在app compat v21中对TextAppearance样式感到困惑

当我使用appcompat v21Light.DarkActionBar我的应用程序的主题我有:

如果我用?android:textAppearanceMedium我的文字有颜色

如果我用@android:style/TextAppearance.Medium我的文字有颜色

这两者有什么区别?根据定义,我认为它们应该是相同的,第二个只是更明确地表达第一个?

android android-theme

3
推荐指数
1
解决办法
3880
查看次数

可以在android studio编辑器中设置图像背景吗?

我想自定义android工作室编辑器背景,所以我想将图像设置为编辑器,是否可能,是否有任何选项执行.

android background-image android-theme android-studio

3
推荐指数
2
解决办法
3402
查看次数

`context.getColor`中`theme`有什么用?

背景

从API 23开始,不建议使用获取颜色getColor(仅通过为其提供资源ID)的小方法:

在此处输入图片说明

相反,我们被告知也要使用包含Theme参数的方法:

在API级别23中不推荐使用此方法。请改用getColor(int,Theme)。

https://developer.android.com/reference/android/content/res/Resources.html#getColor(int,android.content.res.Resources.Theme

问题

文档对的内容不多说theme

在此处输入图片说明

https://developer.android.com/reference/android/content/res/Resources.html#getColor(int,android.content.res.Resources.Theme

我发现了什么

通过Internet搜索,我能找到的就是我们可以使用支持库来获取颜色:

ContextCompat.getColor(context, R.color.color_name);
Run Code Online (Sandbox Code Playgroud)

这有点奇怪,因为在幕后,似乎并没有对主题做任何事情。这是它的代码:

@ColorInt
    public static final int getColor(@NonNull Context context, @ColorRes int id) {
        if (Build.VERSION.SDK_INT >= 23) {
            return context.getColor(id);
        } else {
            return context.getResources().getColor(id);
        }
    }
Run Code Online (Sandbox Code Playgroud)

查看Context.getColor,我可以看到:

在此处输入图片说明

在我看来,它使用的是活动的主题?

问题

  1. “主题”参数的目的是什么?

  2. 如何使用?是否有关于它的任何样本/教程/文章?

  3. 为什么仍然不推荐使用该功能?对我来说仍然可以安全使用...

  4. 支持库功能有什么用?与不赞成使用的功能有何不同?

android android-theme android-resources

3
推荐指数
1
解决办法
1996
查看次数