【问题现象】

1、首先,你在AndroidManifest.xml中声明一个activity,不给application或者activity设置android:theme, 例如这样:

  <applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"><activity android:name=".MainActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

或者是给application或者activity设置一个非透明的主题,例如这样:

<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"><activity android:name=".MainActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

2、接着,你企图在代码中动态设置该activity的主题为透明主题,例如这样:

  @Overrideprotected void onCreate(Bundle savedInstanceState) {setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}

那么,我们来看看运行效果:

很明显,背景并没有变透明,依然是黑色背景,所以在super.onCreate(savedInstanceState)前设置透明背景也是无效的
3、然后,有人说,你设置的位置不对吖,setTheme这句代码应该放在super.onCreate(savedInstanceState)之后,setContentView之前设置才有效果,那么,我们来试试:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}

看看出来的效果:

很明显,依然还是没有变成透明主题效果
4、那么,我们再试试重写getTheme来返回透明的主题样式,看看是否有效果

 @Overridepublic Resources.Theme getTheme() {Resources.Theme theme = super.getTheme();theme.applyStyle(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen, true);return theme;}

结果还是跟上面一样,背景依然不是透明

【问题分析】

在上面,我们尝试各种操作(其实这些操作都是百度搜索到网上说的做法),都没法在代码里面动态将activity的主题样式设置为透明,那么问题点出在哪里了呢?后来决定Google搜索一下,发现有个英文博客提到一个关键点:

这个英文博客提到要是设置的是非透明主题样式的话,直接用setTheme设置是可以动态设置的,但是假如你想要通过setTheme设置透明主题样式的话,android系统似乎自动忽略了你透明主题中的windowIsTranslucent=true这个标志,依然还是显示非透明的主题样式

【问题解决】

我们看看那个英文博客说怎么解决这个问题呢?

1、首先,在AndroidManifest.xml中给activity随便设置一个透明的主题样式,比如: @android:style/Theme.Translucent,这样设置之后,你在代码里随便设置哪个透明主题都可以生效
2、然后博客提到不可以直接调用setTheme(R.style.MyOwnTranslucentTheme)来设置主题样式,因为这样会使得透明失效,而是通过调用getTheme().applyStyle(R.style.MyOwnTranslucentTheme, true)来设置自己想要的透明样式
其实,我测试直接调用setTheme就可以设置,你们可以试试

【尾声】

可能有人有疑问说,既然直接在AndroidManifest.xml设置透明主题样式是可以直接生效的,为何还要多此一举在代码通过setTheme来动态设置呢?其实,应用场景还是挺多的,比如:
1、本来你的activity是个非透明主题样式或者是个透明有标题的主题样式,然后在某个时间,你希望动态设置为透明无标题全屏主题样式,那么你就需要通过setTheme来动态设置
2、插件化加载插件的activity时候,占位activity就需要根据插件真实的主题样式设置,所以也是会需要用到setTheme去动态设置透明主题样式的需求

Android setTheme设置透明主题无效相关推荐

  1. Android背景设置透明和半透明效果

    设置透明效果 大概有三种 1.用android系统的透明效果 Java代码  android:background="@android:color/transparent"  例如 ...

  2. android设置透明主题后背景为黑色,android – 设置主题Programmactically导致黑色背景...

    当我运行我的 Android应用程序时,我正在调用一种方法来检查应用程序是否在平板电脑上运行: public boolean isTablet(Context context){ boolean xl ...

  3. android如何设置透明字体颜色,android TextView文字透明度跟背景透明度设置

    当前位置: 我的异常网 » Android » android TextView文字透明度跟背景透明度设置 android TextView文字透明度跟背景透明度设置 www.myexceptions ...

  4. android activity设置透明或者半透明背景

    1.在res/valuse/styles.xml中添加如下代码 <!--是否显示标题窗口背景 透明窗口是否透明--> <style name="NoTitleTranslu ...

  5. Android activity设置透明背景

    在mainifase中设置: android:theme="@android:style/Theme.Translucent"如下:<activity android:nam ...

  6. android代码设置背景setBackgroundColor无效

    我们自己定义一个color.xml文件,然后再xml中引用此文件中的颜色,一切顺利. 但当我们在代码中如view.setBackgroundColor(R.color.red)来引用我们自定义的xml ...

  7. android fragment 设置透明,Android透明DialogFragment

    我有一个对话框片段,当WidgetConfig活动正在运行时显示.该对话框显示用户可以选择某些项目的列表.我希望这个对话框是透明的,这样你就可以在对话框的背景中看到主屏幕.这正是我目前在WidgetC ...

  8. Android——动态设置view背景颜色setBackgroundColor

    setBackgroundColor 用于动态设置view背景颜色 今天写代码的时候遇到个小问题 动态设置的时候用Color.GRAY,系统自己带着的颜色,是没有问题的 但是用自己定义的颜色,就不生效 ...

  9. android 透明主题 crash,Android 8.0 的填坑(透明的activity崩溃)

    一.透明的activity 不能继续使用 java.lang.RuntimeException:Unable to start activity ComponentInfo{net.maipeijia ...

  10. Android 设置透明 Activity

    App中窗口型的页面,我们可以使用Dialog,popwindow,另外还能透明的Activity来实现. # 当然这也简单:在 AndroidManifest.xml 中对 目标 Activity ...

最新文章

  1. 过年回家应对七大姑八大姨,程序猿绝了!
  2. pip安装模块警告InsecurePlatformWarning: A true SSLContext object is not available.
  3. memcached单点故障与负载均衡
  4. 查询mysql所有对象_Mysql查看数据库对象(SQL命令总结)
  5. 从1985年到2020年,编程语言排行有哪些变化?
  6. kafka消费者开发方式小结
  7. Linux终端命令(6)--ifconfig,(find -name ‘*.txt‘ | xargs rm -rf)
  8. mysql 查询正在执行的事务以及等待锁 常用的sql语句
  9. 第 1 章 Readme
  10. mysql left join 几个意思
  11. dispatcherServlet-servlet.xml(SSM maven 项目)
  12. 【Python-numpy】输出array时array中间是省略号而没有输出全部内容
  13. html中所用到的英语单词怎么写,8的英语单词怎么写
  14. NUCLEO开发板:STM32 st-link驱动程序错误
  15. 数据结构:图结构的实现
  16. word字体号对应的磅数
  17. 计算机考证报名时间表
  18. 博弈论+指鹿为马DP法(CSU 2095: Sweet War题解)
  19. nn.Conv1d 理解
  20. 论坛复制乱码消除小程序

热门文章

  1. 将MATLAB任务栏变成白色的图标恢复
  2. 阿里云CTO章文嵩:阿里云强大的数据和计算能力助力企业实现“弯道超车”
  3. CMD控制台光标无法显示
  4. 【转载】 Sqlserver使用Left函数从最左边开始截取固定长度字符串
  5. Hard Swish激活函数
  6. delphi Use MSBuild externally to compile 无法DEBUG
  7. 什么是词频?词频的原理是什么?
  8. 一步一步排查真实拍图片不能上传的问题
  9. Android使用Activity用作弹出式对话框Dialog
  10. 使用window.close()关闭标签页的注意事项