美文网首页
Android主题(theme)的一些总结

Android主题(theme)的一些总结

作者: 星晴_371a | 来源:发表于2021-04-21 17:30 被阅读0次

一、theme主题

1.1是个啥?

theme 是我们应用的一个主题,或者是一种风格,比如我们穿衣服一套休闲装或者一套运动装,我们对其进行设置就可以更变咱们这个应用的相关皮肤(就像lol或者王者里面的皮肤一样)。一般它是作用于整个应用的对应的是咱们的application,但是有时候部分的界面需要特殊的处理比如一个特定的activity,设置一个单独的皮肤。

1.2在哪里设置?

首先我们可以看看咱们的manife文件中,application的配置中:

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</paalication>

我们可以看到上面的配置文件中分别从两个地方设置了主题:

1.application中设置,这个就是全局的,如果你不再单独的重新为你要设置的activity设置一个主题,那么这个activity的主题就是“@style/AppTheme”这个主题
2.activity中设置,可以看到MainActivity这个activity就被单独的设置了一个主题为:@style/AppTheme.mytheme

所以主题的作用域就是application跟activity,不涉及到咱们的View
当然了有同学就会问,我不想在xml中设置,用代码设置,当然也可以,如下:

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); 
     setTheme(android.R.style.mytheme); 
     setContentView(R.layout.activity_main); 
}

这里唯一需要注意的就是,我们设置的时候要在setContentView之前设置

1.3常见的系统主题展示,以及内部属性?

常见的系统主题:(来自https://blog.csdn.net/oudetu/article/details/78568436

android:theme="@android:style/Theme.Dialog"   将一个Activity显示为能话框模式  

android:theme="@android:style/Theme.NoTitleBar"  不显示应用程序标题栏  

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  不显示应用程序标题栏,并全屏

android:theme="Theme.Light"  背景为白色  

android:theme="Theme.Light.NoTitleBar"  白色背景并无标题栏  

android:theme="Theme.Light.NoTitleBar.Fullscreen"  白色背景,无标题栏,全屏

android:theme="Theme.Black"  背景黑色  

android:theme="Theme.Black.NoTitleBar"  黑色背景并无标题栏

android:theme="Theme.Black.NoTitleBar.Fullscreen"    黑色背景,无标题栏,全屏

android:theme="Theme.Wallpaper"  用系统桌面为应用程序背景  

android:theme="Theme.Wallpaper.NoTitleBar"  用系统桌面为应用程序背景,且无标题栏  

android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"  用系统桌面为应用程序背景,无标题栏,全屏  

android:theme="Translucent"  半透明  

android:theme="Theme.Translucent.NoTitleBar" 半透明、无标题栏  

android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 半透明、无标题栏、全屏  

android:theme=”Theme.Panel” 半透明,无标题,全屏

android:theme=”Theme.Light.Panel”平板风格显示

下面还有被人整理的表格:(来自:https://menxindiaolong.blog.csdn.net/article/details/86561559

image.png

以上就是常见的系统主题,我们可以直接用,有这么多的主题,那么怎么样才是我们要的呢?往下看

1.4我们自己想定义个我们自己的主题呢?

首先我们要在哪里定义?
定义那些属性?
那些属性对应界面那些位置?

1.首先我们要找到资源文件下的路径 在res/values/style.xml 中定义一个自己要的主题

<style name="MyTheme" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

这里的MyTheme就可以在需要用的地方来使用了
好多属性啊,都是个啥意思呢?如下常用属性:(来自:https://www.jianshu.com/p/06a3bbb7ce79

<style name="AppThemeDemo" parent="Theme.AppCompat.Light.DarkActionBar">

    <!-- 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色 -->
    <item name="colorPrimary">@color/white</item>
    <!-- 应用的主要暗色调,statusBarColor 默认使用该颜色 -->
    <item name="colorPrimaryDark">@color/white</item>
    <!-- 一般控件的选中效果默认采用该颜色,如 CheckBox,RadioButton,SwitchCompat,ProcessBar等-->
    <item name="colorAccent">@color/colorAccent</item>

    <!-- 状态栏、顶部导航栏 相关-->
    <!-- status bar color -->
    <item name="android:statusBarColor">#00000000</item>
    <!-- activity 是否能在status bar 底部绘制 -->
    <item name="android:windowOverscan">true</item>
    <!-- 让status bar透明,相当于statusBarColor=transparent + windowOverscan=true -->
    <item name="android:windowTranslucentStatus">true</item>
    <!-- 改变status bar 文字颜色, true黑色, false白色,API23可用-->
    <item name="android:windowLightStatusBar">true</item>
    <!-- 全屏显示,隐藏状态栏、导航栏、底部导航栏 -->
    <item name="android:windowFullscreen">true</item>
    <!-- hide title bar -->
    <item name="windowNoTitle">true</item>
    <!-- 底部虚拟导航栏颜色 -->
    <item name="android:navigationBarColor">#E91E63</item>
    <!-- 让底部导航栏变半透明灰色,覆盖在Activity之上(默认false,activity会居于底部导航栏顶部),如果设为true,navigationBarColor 失效 -->
    <item name="android:windowTranslucentNavigation">true</item>

    <!-- WindowBackground,可以设置@drawable,颜色引用(@color),不能设置颜色值(#fffffff),
    Window区域说明:Window涵盖整个屏幕显示区域,包括StatusBar的区域。当windowOverscan=false时,window的区域比Activity多出StatusBar,当windowOverscan=true时,window区域与Activity相同-->
    <item name="android:windowBackground">@drawable/ic_launcher_background</item>
    <!--<item name="android:windowBackground">@color/light_purple</item>-->

    <!-- 控件相关 -->
    <!-- button 文字是否全部大写(系统默认开)-->
    <item name="android:textAllCaps">false</item>

    <!-- 默认 Button,TextView的文字颜色 -->
    <item name="android:textColor">#B0C4DE</item>
    <!-- 默认 EditView 输入框字体的颜色 -->
    <item name="android:editTextColor">#E6E6FA</item>
    <!-- RadioButton checkbox等控件的文字 -->
    <item name="android:textColorPrimaryDisableOnly">#1C71A9</item>
    <!-- 应用的主要文字颜色,actionBar的标题文字默认使用该颜色 -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- 辅助的文字颜色,一般比textColorPrimary的颜色弱一点,用于一些弱化的表示 -->
    <item name="android:textColorSecondary">#C1C1C1</item>
    <!-- 控件选中时的颜色,默认使用colorAccent -->
    <item name="android:colorControlActivated">#FF7F50</item>
    <!-- 控件按压时的色调-->
    <item name="android:colorControlHighlight">#FF00FF</item>
    <!-- CheckBox,RadioButton,SwitchCompat等默认状态的颜色 -->
    <item name="android:colorControlNormal">#FFD700</item>
    <!-- 默认按钮的背景颜色 -->
    <item name="android:colorButtonNormal">#1C71A9</item>

    <!-- 【无效】 在theme中设置Activity的属性无效, 请到AndroidManifest中Activity标签下设置 -->
    <item name="android:launchMode">singleTop</item>
    <item name="android:screenOrientation">landscape</item>

</style>

上面的属性基本咱们使用的时候已经够了,有同学还是不太清楚,比如那个colorAccent具体是啥,colorPrimary有具体是哪里的颜色
咱在网上找了一个图,应该还是挺清晰的吧


image.png

1.5 自定义的一些主题属性?

有时候我们的需求会涉及到那些android原生没有提供的主题样式,这个时候就需要我们自己定义,
举个例子,有个activity名字叫D里面我们有个三个TextView,不同的入口进入的时候(例如:A,B,C三个不同的Activity),D中的这个三个TextView,x 、y、z要显示不同的字体颜色
当然了,有同学会说我们可以在进去D这个Activity之后对字体进行颜色设置,这里是举一个简单的例子,(万一这个应用中有20个Activity,需要通过不同的入口显示不同的字体颜色,你还每个Activity进入之后,获取控件TextView,再一个个setTextColor么)
首先,咱们来自定义一个属性,在res路径下创建个资源文件attr.xml如下:


image.png

然后,在attr.xml中定义三个属性分别对应这三个TextView的字体颜色,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="myTextColor1" format="color"/>
    <attr name="myTextColor2" format="color"/>
    <attr name="myTextColor3" format="color"/>
</resources>

下一步,咱们在需要切换TextView颜色的activity定义咱们自己的主题theme

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="MyTheme1" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="myTextColor1">@color/color1</item>
        <item name="myTextColor2">@color/color1</item>
        <item name="myTextColor3">@color/color1</item>
    </style>

  <style name="MyTheme2" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="myTextColor1">@color/color2</item>
        <item name="myTextColor2">@color/color2</item>
        <item name="myTextColor3">@color/color2</item>
    </style>
    以此类推定义 MyTheme3
</resources>                     

接下来我们在activity的布局文件中设置TextView的属性

    <TextView 
        android:id="@+id/tv_text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="?attr/myTextColor1"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/tv_text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="?attr/myTextColor2"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/tv_text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="?attr/myTextColor3"
        android:textSize="16sp"
        />

然后咱们再在不同地方进入D这个Activity的时候加上判断,不同的入口显示不同的样式

onCreate方法中判断
//切换不同的风格,必须在setContentView之前做
swith(themeType){
case 1:
          setTheme(R.style,MyTheme1);
break;
case 2:
          setTheme(R.style,MyTheme2);
break;
   ............
 setContentView(R.layout.activity_main);

当然了这些都是Theme的一些延伸,实际的应用过程中,有些应用会用到一些实时换皮肤的效果,比如网易云音乐,项目级的会有更好的方法来实现

1.6 关于应用换肤的延伸?

这个博主写的很详细
https://www.jianshu.com/p/af7c0585dd5b

相关文章

网友评论

      本文标题:Android主题(theme)的一些总结

      本文链接:https://www.haomeiwen.com/subject/mslzlltx.html