我在手动管理暗模式时遇到了一个大问题。
在应用程序启动时,第一个活动会在 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 没有显示任何有关崩溃的信息,应用程序也没有显示有关崩溃的任何对话框),并且当它启动时,它会自动设置它的主题到系统主题(所以在我的示例中它进入黑暗模式)。
目前的问题是,一些本来应该在深色模式下看到的文本现在有了浅色模式主题,使它们与黑色背景融为一体;应用程序中用于从深色模式更改为浅色模式的开关保持正确的设置(显示未启用深色模式),但应用程序处于深色模式。如果应用程序重新启动,一切都会恢复正常,并且应用程序会正确显示在浅色主题中。
当应用程序长时间停留在后台时,我无法重现该问题,但我认为它也可能发生。
我刚刚开始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
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: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) 我正在尝试为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) 我在旧版本的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仍显示标题).此应用程序是白色的,而不是黑色.
在这一点上的任何建议将是一个很大的帮助!谢谢
我有活动。在按钮上单击,我想更改主题,但是到处都发现,该主题只能设置一次,而在setContentView之前也可以设置。重新启动活动不是我的选择。也许使用attrs必须解决此问题。但是我不知道如何使用它。请帮忙!!
提前致谢!!
当我使用appcompat v21与Light.DarkActionBar我的应用程序的主题我有:
如果我用?android:textAppearanceMedium我的文字有灰颜色
如果我用@android:style/TextAppearance.Medium我的文字有黑颜色
这两者有什么区别?根据定义,我认为它们应该是相同的,第二个只是更明确地表达第一个?
我想自定义android工作室编辑器背景,所以我想将图像设置为编辑器,是否可能,是否有任何选项执行.
从API 23开始,不建议使用获取颜色getColor(仅通过为其提供资源ID)的小方法:
相反,我们被告知也要使用包含Theme参数的方法:
在API级别23中不推荐使用此方法。请改用getColor(int,Theme)。
文档对的内容不多说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,我可以看到:
在我看来,它使用的是活动的主题?
“主题”参数的目的是什么?
如何使用?是否有关于它的任何样本/教程/文章?
为什么仍然不推荐使用该功能?对我来说仍然可以安全使用...
支持库功能有什么用?与不赞成使用的功能有何不同?