导航:首页 > 操作系统 > androidapptheme

androidapptheme

发布时间:2023-04-10 16:21:07

1. android怎样优雅的动态改变整个application的theme

Android中实现theme主题可以使用在activity中晌祥使用setTheme(int)的方法,SDK中对此方法的说明为:

//Set the base theme for this context. Note that this should be called before any views are instantiated in the Context (for example before calling android.app.Activity.setContentView or android.view.LayoutInflater.inflate).
//需要在setcontentview函数或者inflate函数之前使用。

效果图如下:

实现步骤:
首先需要定义一个属性,此属性用于赋值给控件的属性,相当于控件属性值的“变量”。
在attrs.xml中,定义三个属性,属性的format均为reference|color

<resources>

<attr name="button_bg" format="reference|color" />
<attr name="activity_bg" format="reference|color" />
<attr name="text_cl" format="reference|color" />

</resources>

接下来,在styles.xml中,编写自定义的Theme

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

<style name="AppTheme" parent="AppBaseTheme">
<item name="text_cl">#ffffff</item>
<宴镇搏item name="button_bg">#000000</item>
<item name="activity_bg">#ffffff</item>
</style>

<style name="DarkTheme" parent="AppBaseTheme">
<item name="text_cl">#000000</item>
<item name="button_bg">#ffffff</item>
<item name="activity_bg">#000000</item>
</style>

选择一种模式旅颤作为程序的默认theme,注意:由于我是在layout布局文件中定义的view的样式,因此,为了保证theme切换时不会出现找不到资源的问题,因此需要在每一种用到的自定义theme中,都加上item。这里的item如text_cl和view的textColor属性的format是一致的。
Android manifest文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testandroidsettheme"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />

<application
android:allowBackup="true"
android:name="com.example.testandroidsettheme.app.MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testandroidsettheme.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</manifest>

2. Android系统自带样式Theme总结

本文从网上复制,给自己做笔记的,摘自: http://blog.csdn.net/hongya1109110121/article/details/11985545

Android系统自带样式(@android:style/) (转)

1 android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"

布局页面最上面 不会显示  android:icon="@drawable/ic_launcher"中的值和android:label="@string/app_name"的值。

2 android:theme="@style/AppTheme"

布局页面最上面 显示  android:icon="@drawable/ic_launcher"中的值和android:label="@string/app_name"的值。

其他

在AndroidManifest.xml文件的activity中配置

1、android:theme="@android:style/Theme"

默认状态,即如果theme这里不填任何属性的时候,默认为Theme

2、android:theme="@android:style/Theme.NoDisplay"

任何都不显示。比较适用于只是运行了activity,但未显示任何东西

3、android:theme="@android:style/Theme.NoTitleBar“

背景主题的没有标题栏的样式,默认如果没有设置的话,显示黑背景

4、android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

背景主题的没有标题栏且全屏的样式,默认为黑背景

5、android:theme="@android:style/Theme.Black"

默认状态下黑背景

6、android:theme="@android:style/Theme.Black.NoTitleBar"

黑背景主题的没有标题栏的样式

7、android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

黑背景主题的没有标题栏且全屏的样式

8、android:theme="@android:style/Theme.Light"

默认状态下亮背景,与上述黑背景Theme.Black相反

9、android:theme="@android:style/Theme.Light.NoTitleBar"

亮背景主题的没有标题栏的样式,与Theme.Black.NoTitleBar相反

10、android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"

亮背景主题的没有标题栏且全屏显示的样式,与Theme.Black.NoTitleBa.Fullscreenr相反

11、android:theme="@android:style/Theme.Dialog"

对话框样式 将整个activity变成对话框样式出现

12、android:theme="@android:style/Theme.InputMethod"

Window animations that are applied to input method overlay windows

13、android:theme="@android:style/ Theme.Panel"

删除掉所有多余的窗口装饰,在一个空的矩形框中填充内容,作用范围相当于把dialog中的所有元素全部去掉,只是一个空的矩形框,且此为默认的样式

14、android:theme="@android:style/ Theme.Light.Panel"

删除掉所有多余的窗口装饰,在一个空的矩形框中填充内容,作用范围相当于把dialog中的所有元素全部去掉,只是一个空的矩形框,且默认是light的样式

15、android:theme="@android:style/Theme.Wallpaper"

使用墙纸做主题,默认状态。

16、android:theme="@android:style/ Theme.WallpaperSettings"

使用墙纸做主题,默认是使用将上一个界面调暗之后作为主题

17、android:theme="@android:style/ Theme.Light.WallpaperSettings"

使用墙纸做主题,默认Light状态

18、android:theme="@android:style/Theme.Wallpaper.NoTitleBar"

使用墙纸做主题,且没有标题栏

19、android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"

使用墙纸做主题,且没有标题栏,且全屏显示

20、android:theme="@android:style/Theme.Translucent"

半透明状态下的背景,将运行此activity之前的屏幕作为半透明状态作为此activity运行时的样式。

21、android:theme="@android:style/Theme.Translucent.NoTitleBar"

半透明状态下没有标题栏的背景,将运行此activity之前的屏幕作为半透明状态作为此activity运行时的样式。

22、android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"

半透明状态下没有标题栏且全屏的背景,将运行此activity之前的屏幕作为半透明状态作为此activity运行时的样式。

摘自: http://blog.csdn.net/hongya1109110121/article/details/11985545

3. Android APP启动白(黑)屏解决方案(适用于App启动立即展现logo、版权等)

Android APP启动白(黑)屏解决方案(适用于App启动立即展现logo、版权等)

我们要求在App启动时显示我们设置的启动页面,实测发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面。

简单高效的解决方案一:

1、使用layer-list制作背景样式

新建bg_start_pic.xml

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

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 设置整个屏幕背景为白色 -->

<item>

    <color android:color="@color/white" />

</item>

<!-- 中间logo -->

<item

    android:width="@dimen/dp_150"

    android:height="@dimen/dp_150"

    android:gravity="center">

    <bitmap android:src="@drawable/icon_splash_logo" android:gravity="center" />

</item>

<!-- 底部图表 -->

<item

android:bottom="10dp"

android:gravity="bottom|center_horizontal">

<bitmap android:src="@drawable/pic_banner_home" />

</item>

</layer-list>

2、修改styles.xml文件

增加SplashTheme主题

<style name="SplashTheme" parent="AppTheme">

    <item name="android:windowNoTitle">true</item>

    <item name="android:windowBackground">@drawable/bg_start_pic</item>

</style>

3、修改AndroidManifest.xml

LauncherActivity使用StartAppTheme主题

<activity

            android:name=".LauncherActivity"

            android:label="@string/app_name"

            android:theme="@style/StartAppTheme" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

 </activity>

4. 如何让手机主页背景变成摄像头代码

android摄像头去背景代码,Android《第一行代码》-调用摄像头拍照问题解决
说明:由于在测试的时候使用的是Android 7.1的机器,代码会出现以下问题,
(1)APP安装在机器上实测会出现调用相机无法打开的现象;

(2)APP调用裁剪工具的时候会有Toast提示“无法加载此图片”。
Step 1. 新建一个activity_main.xml布局,这个没什么问题。

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/take_photo"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="拍照"/>

android:id="@+id/image_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"/>

Step 2. 新建MainActivity,以毁伏下是郭霖大神书中原来的代码。代码中比较难以理解的地方注释都写的很详细。

public class MainActivity extends AppCompatActivity {

public static final int TAKE_PHOTO = 1;

public static final int CROP_PHOTO = 2;

private Button takePhoto;

private ImageView imageView;

private Uri imageUri;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

takePhoto = (Button)findViewById(R.id.take_photo);

imageView = (ImageView)findViewById(R.id.image_view);

takePhoto.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

File outputImage = new File(Environment.getExternalStorageDirectory(),

"maybe.jpg");

if(outputImage.exists()){

outputImage.delete();

}

try {

outputImage.createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

//将File对象转换成Uri对象,因为Uri对象标识着maybe.jpg这张图片的唯一地址。

//由纤轮携于Intent能传递的数据空间有桐喊限,所以需要转化成Uri

//大图片用Uri,小图片用Bitmap

//以下代码解决了Android 7.0 打开相机崩溃的问题

if(Build.VERSION.SDK_INT > 24){

imageUri = FileProvider.getUriForFile(MainActivity.this,

"com.example.android.choosepicdemo.fileprovider",outputImage);

}else{

imageUri = Uri.fromFile(outputImage);

}

//Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

//第一个参数:一个Intent对象

//第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中,

//以便确定返回的数据是从哪个Activity中返回

startActivityForResult(intent,TAKE_PHOTO);

}

});

}

/*第一个参数:这个整数requestCode提供给onActivityResult,是以便确认返回的数据是从哪个Activity返回的。

这个requestCode和startActivityForResult中的requestCode相对应。

第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。

第三个参数:一个Intent对象,带有返回的数据。*/

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (requestCode){

case TAKE_PHOTO:

if(resultCode == RESULT_OK){

Intent intent = new Intent("com.android.camera.action.CROP");

//以下两行代码适配Android 7.0 解决了无法加载图片的问题

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

intent.setDataAndType(imageUri,"image/*");

intent.putExtra("scale",true);

intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

startActivityForResult(intent,CROP_PHOTO);

}

break;

case CROP_PHOTO:

if(resultCode == RESULT_OK){

// 因为imageUri是Uri类型的,需要转换才能被decodeStream使用

// 使用getContentResolver()

// 因为在Android系统里面,数据库是私有的。

// 一般情况下外部应用程序是没有权限读取其他应用程序的数据。

// 如果你想公开你自己的数据,你有两个选择:

// 你可以创建你自己的内容提供器(一个ContentProvider子类)或者

// 你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限。

// 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,

// 在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例

try {

//解析成Bitmap

Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));

imageView.setImageBitmap(bitmap);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

break;

default:

break;

}

}

}

需要注意的是以下代码是增加了的内容:

//以下代码解决了Android 7.0 打开相机崩溃的问题

if(Build.VERSION.SDK_INT > 24){

imageUri = FileProvider.getUriForFile(MainActivity.this,

"com.example.android.choosepicdemo.fileprovider",outputImage);

}else{

imageUri = Uri.fromFile(outputImage);

}

如果不这么处理的话,会导致在调用相机获取 Uri 的时候发生崩溃。

原因很明显,file:// 不被允许作为一个附加的 Uri 的意图,否则会抛出 FileUriExposedException 。其实背后有一个很好的理由,如果文件路径被发送到目标应用程序(相机应用程序在这种情况下),文件将完全访问通过相机应用程序的过程,而不仅仅只有发起者能收到。但让我们考虑一下,实际上是由我们的应用程序去启动摄像头拍照,并保存作为我们的应用程序的代表文件。因此,该文件的访问权限应该是我们的应用程序而不是摄像头应用程序本身。这就是为什么现在 file:// 在 targetSdkVersion 24 中要求每一位开发者都去完成这个任务。参考博文:http://www.sohu.com/a/136282885_659256

所以需要采用FileProvider来处理。

具体的步骤如下:

首先在AndroidManifest.xml中声明provider。这里要注意android:authorities要是你的包名一致,其他固定。

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:authorities="com.example.android.choosepicdemo.fileprovider"

android:name="android.support.v4.content.FileProvider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/provider_paths"/>

在res文件夹下创建xml文件夹,并创建provide_paths.xml(该名称应与上述android:resource里一致),maybe为图片保存时的名称,根据你自己命名而定。

修改java代码如下

//以下代码解决了Android 7.0 打开相机崩溃的问题

if(Build.VERSION.SDK_INT > 24){

imageUri = FileProvider.getUriForFile(MainActivity.this,

"com.example.android.choosepicdemo.fileprovider",outputImage);

}else{

imageUri = Uri.fromFile(outputImage);

5. 如何修改Android App的样式风格

android中可以自定义主题和风格。风格,也就是style,我们可以将一些统一的属性拿出来,比方说,长,宽,字体大小,字体颜色等等。可以在res/values目录下新建一个styles.xml的文件,在这个文件里面有resource根节点,在根节点里面添加item项,item项的名字就是属性的名字,item项的值就是属性的值,如下所示:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyText" parent="@android:style/TextAppearance">
<item name="android:textColor">#987456</item>
<item name="android:textSize">24sp</item>
</style>
</resources>

style中有一个父类属性parent, 这个属性是说明当前的这个style是继承自那个style的,当然这个style的属性值中都包含那个属性中的,你也可以修改继承到的属性的值,好了,style完成了,我们可以测试一下效果了,先写一个布局文件,比如说一个TextView什么的,可以用到这个style的。这里我就写一个EditText吧。下面是布局文件:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas。android。com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/myEditText"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/MyText"
android:text="测试一下下"/>
</LinearLayout>

说完了style,下面就说说Theme,Theme跟style差不多,但是Theme是应用在Application或者Activity里面的,而Style是应用在某一个View里面的,还是有区别的,好了,废话不多说,还是看代码吧。下面的是style文件:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyText" parent="@android:style/TextAppearance">
<item name="android:textColor">#987456</item>
<item name="android:textSize">24sp</item>
</style>
<style parent="@android:style/Theme" name="CustomTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@drawable/icon</item>
<item name="android:windowBackground">?android:windowFrame</item>
</style>
</resources>

style中有一个父类属性parent, 这个属性是说明当前的这个style是继承自那个style的,当然这个style的属性值中都包含那个属性中的,你也可以修改继承到的属性的值,好了,style完成了,我们可以测试一下效果了,先写一个布局文件,比如说一个TextView什么的,可以用到这个style的。这里我就写一个EditText吧。下面是布局文件:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas。android。com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/myEditText"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/MyText"
android:text="测试一下下"/>
</LinearLayout>

说完了style,下面就说说Theme,Theme跟style差不多,但是Theme是应用在Application或者Activity里面的,而Style是应用在某一个View里面的,还是有区别的,好了,废话不多说,还是看代码吧。下面的是style文件:
复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyText" parent="@android:style/TextAppearance">
<item name="android:textColor">#987456</item>
<item name="android:textSize">24sp</item>
</style>
<style parent="@android:style/Theme" name="CustomTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@drawable/icon</item>
<item name="android:windowBackground">?android:windowFrame</item>
</style>
</resources>

可以看到这里写了一个继承自系统默认的Theme的主题,里面有3个属性,这里强调一下第三个属性的值的问题,这里打个问号,然后加前面的一个item的名字表示引用的是那个名字的值,也就是那个名字对应的图片。
然后我们在Manifest.xml里面的Application里面加一个Theme的属性,这个属性对应的就是我们上面写的Theme。
复制代码 代码如下:

<application android:icon="@drawable/icon" android:label="@string/app_name"
android:theme="@style/CustomTheme">
<activity android:name=".TestStyle"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

上面的代码没有标题栏,背景和fram都是我们设置的图片。当然也可以在代码中设置主题:
复制代码 代码如下:

package com.test.shang;
import android.app.Activity;
import android.os.Bundle;
public class TestStyle extends Activity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.CustomTheme);
setContentView(R.layout.test_style);
}
}

6. 记一次使用Android AppCompat(兼容库)的Theme所引发的思考

最近在优化App,首先从界面上优化,对所有页面的ui绘制进行查看和优化,其中发现在

Api 小于21的手机设备上的效果图为:

运行在Api大于21的设备上的效果图为:

同样是使用统一兼容主题

在图1中发现了过度绘制现象。就是这一端绿色的区域。可我们的完全定义的是全屏的啊?为什么会出现这种情况呢。

在解释上面现象之前,首先了解下Android使用Theme的正确用法:

Android的Theme的主要来源分为以下三种:

这里主要探讨前两者,自定义主题不做探讨,使用Android系统自带的Theme要加上"android:",如:android:Theme.Light,使用v7兼容包的主题就不需要前缀了,直尺灶接:Theme.AppCompat。现在看看有哪些主题:

1.系统自带主题:

Theme.AppCompat主题是兼容主题,是什么意思呢?

意思就是说如果运行程序在手机API是21则就是相当于使用Material主题,如果运行程序的手机API是11则就相当于使用Holo主题,以此类推。

兼容v7会被Google公司不断升级:

比如appcompat-v7-21.0表示升级到向API 21兼容

比如appcompat-v7-23.2表示升级到向API 23兼容

所以要使用最新的兼容包。

我们已经知道了统一使用兼容包的话,目标设备API 为21及以上时会使用Material主题,API 为11时使用Holo主题,下面我们来比较下Material与Holo主题高困和的区别:

通过比较发现Holo主题的windoContentOverlay使用ab_solid_shadow_holo为背景,而Material未设置任戚盯何背景。再来看下windoContentOverlay是何许人也,查看源码得知:

onCreate()中设置的Window.FEATURE_NO_TITLE对应的窗口修饰布局文件为screen_simple.xml:

windowContentOverlay代表content的foreground并且填充宽,位于content的顶部,代表内容区域顶部的阴影背景(与TitleBar和ActionBar都没有关系),因为这种属性是在无标题栏的时候才会被设置到content的top,所以有标题栏或者actionBar时也不会出现这种情况。现在问题就迎刃而解了,修改Theme为:

增加<item name="android:windowContentOverlay">@null</item>

7. 如何在 Android 应用程序中使用自定义主题

在Android中,定义外观最简单的方式是直接设置属性在视图对象上。由于要对整个应用程序设置样式,这种方法就显得不是很方便了。因此,我们可以创建 样式来绑定视图属性。但要注意的是,样式只能设置在xml里。这意味着,我们在创建/加载视图的时候,只能一次设置一个样式。下面是如何在res /values/styles.xml文件中给TextView设置属性的示例。 <style name="CustomText" parent="<a href="http" target="_blank" rel="nofollow">@android</a> :style/TextAppearance.Medium"> <item name="android:textSize">20sp</item> <item name="android:textColor">#008</item> </style> 我们引用@style/CustomText样式应用在我们的layout.xml文件中。该样式引用了一个父样式 @android:style/TextAppearance.Medium。由于开始样式引自android: 命名空间,那么我们这个样式默认也随android平台。 创建主题绑定样式 假设我们要改变我们所有TextView的文字大小和颜色,并且不需要明确设置每一个TextView。这是一个非常常见的情况,幸运的 是,Android提供了一个非常强大的主题机制。从本质上讲,主题就是样式资源本身,使用“key”指向具体的样式。一个视图对象基于这个key可以查 看到具体的样式。下面是一个简单的例子,在res/values/themes.xml文件: <style name="Theme.MyApp" parent="<a href="http" target="_blank" rel="nofollow">@android</a> :style/Theme.Holo"> <item name="android:textAppearance">@style/CustomText</item> </style> 如上所述,主题是样式资源本身,所以我们声明一个Theme.App继承自Android平台提供的holo主题。我们将我们的CustomText样式 指定到android:textAppearance属性。属性就是一个预定义的“变量”,它可以被其他资源元素引用。事实上,它也可以创建自定义属性在 res/values/attr.xml文件。 现在有趣的事情来了。我们的主题Theme.MyApp不仅可以通过AndroidManifest.xml的设置应用到Activity上,它也可以在 运行时在代码中设置。你将不得不重新启动当前Activity(或使用ContextWrapper应用UI的主题部分),但它使主题更加动态。

8. 安卓怎么修改系统“DIALOG”风格

具体步骤如下:

1编写一个文本样式。

DIALOG的标题是一个textview,在sytles.xml中,添加如下代码来设置你自己的文本样式:

<style name="DialogWindowTitle">
<item name="android:textSize">22sp</item>
<item name="android:textColor">@color/font_dark_grey</item>
</style>

2设置对话框的标题主题。

上面的标题文本并不能直接设置誉笑缓为对话框的标题样式。 我们还需要编写一个表示标题的主题的style,在这里指定标题的文本样式庆模。代码如下:

<style name="DialogWindowTitle.DeviceDefault">
<item name="android:maxLines">1</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:textAppearance">@style/DialogWindowTitle</item>
</style>

3设置对话框主题。

接下来,我们编写我们的对话框主题,在这里指定标题的主题。由于一些属性并不是public的,所以我们需要继承自原来的某个style,代码如下:

<!--Dialog主题-->
<style name="Theme.DeviceDefault.Dialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
<item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
</style>

4自定义App的主题。

接下来,我们需要在我们的App theme中指定我们的对话框使用这种主题,所以需要定义一个App theme。同样由于App theme的许多属性并不是public的(比如下面要提到的标题下面的那条蓝线),所以我们要继承自一个原生的style。这里我根据程序需要选择了Theme.Holo.Light.NoActionBar,代码如下:

<style name="ParkingTheme" parent="@android:style/Theme.Holo.Light.NoActionBar">
<item name="android:dialogTheme">@style/Theme.DeviceDefault.Dialog</item>
</style>

5指定App主题

我们需要在升颤AndroidManifest.xml文件中,指定我们的app主题。这步很简单,只需要在application标签中指定android:theme的值即可,如下:

android:theme="@style/ParkingTheme"

6编写AlertDialog主题。

我们无法直接继承系统主题里的AlertDialog的style。如把parent指定为Theme.DeviceDefault.Dialog.Alert,Theme.Holo.Dialog.Alert,Theme.DeviceDefault.Light.Dialog.Alert或Theme.Holo.Light.Dialog.Alert,都会导致编译不过。所以我们需要继承自Dialog的style。在这里我以Theme.Holo.Light.Dialog为例,代码如下:

<!--AlderDialog主题-->
<style name="Theme.DeviceDefault.Dialog.Alert" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

7指定AlertDialog的主题。

我们需要在第4步所说的自定义的AppTheme中,添加一行代码来指定要使用的AlertDialog的style,代码如下:

<item name="android:alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item>

8修改标题下面的蓝色线。

表示这条蓝色的线的叫做titleDivider,我们可以通过getResources()的API来获取它的IP,然后设置颜色。代码如下:

public static final void dialogTitleLineColor(Dialog dialog, int color) {
Context context = dialog.getContext();
int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
divider.setBackgroundColor(color);

这行代码对于自定义的Dialog,可以在setContentView之后调用。但是对于AlertDialog,必须在show()方法被调用之后才可以去调用,否则会报错。

9. Android开发主题样式详解

application标签中的@style/AppTheme引用自哪个文唯弊枝件夹中的styles.xml,这是根据运行此程序的手机系统来决定的,卜逗如果手机系统的API版本是11以上就是v11/styles.xml,API版本是14以上就是v14/styles.xml,以此类推。我们可以通过修改AppBaseTheme的父主题来实现我们需要的样式,此文章主要就是来讨论这个主题如何修改。

使用android系统中自带的主题要加上"android:",如:android:Theme.Black
使用v7兼容包中的主题不需要前缀,如:Theme.AppCompat

系统自带主题:
API 1:
android:Theme 根主题
android:Theme.Black 背景黑色
android:Theme.Light 背景白色
android:Theme.Wallpaper 以桌面墙纸为背景
android:Theme.Translucent 透明背景
android:Theme.Panel 平板风格
android:Theme.Dialog 对话框风格

API 11:
android:Theme.Holo Holo根主题
android:Theme.Holo.Black Holo黑主题
android:Theme.Holo.Light Holo白主题

API 14:
android:Theme.DeviceDefault 设备默认根主题
android:Theme.DeviceDefault.Black 设备默认黑主题
android:Theme.DeviceDefault.Light 设备默认白主题

API 21: (网上常说的 Android Material Design 就是要用这种主题)
android:Theme.Material Material根主题
android:Theme.Material.Light Material白主题

兼容包v7中带的主题:
Theme.AppCompat 兼容主题的根主题
Theme.AppCompat.Black 兼容主题的黑色主题
Theme.AppCompat.Light 兼容主题的白色主题

以下都是指“包含”,比如包含“Dialog”表示对话框风格
比如Theme.Dialog、Theme.Holo.Dialog、Theme.Material.Dialog、Theme.AppCompat.Dialog都是对话框风格

Black 黑色风格
Light 光明风格
Dark 黑暗风格
DayNight 白昼风格
Wallpaper 墙纸为背景
Translucent 透明背景
Panel 平板风格
Dialog 对话框风格
NoTitleBar 没有TitleBar
NoActionBar 没有ActionBar
Fullscreen 全屏风格
MinWidth 对话框或者ActionBar的宽度根据内指敏容变化,而不是充满全屏
WhenLarge 对话框充满全屏
TranslucentDecor 半透明风格
NoDisplay 不显示,也就是隐藏了
WithActionBar 在旧版主题上显示ActionBar

10. Android关于Theme.AppCompat相关问题的深入分析

先来看这样一个错误:

No resource found that matches the given name '@style/Theme.AppCompat.Light'

对于这个错误,相信大部分Android开发者都遇到过,可能很多朋友通过网络或者Google已经解决了这个问题,但是网上大部分都只给出了解决方法。

正所谓知其然,知其所以然,本文将从此问题出发,深入分析探讨导致此问题的原因、由其衍生出来的一系列问题及其解决方案。

Android的SDK版本很多,新的SDK版本包含了很多新的特性,为此Google官方提供Android Support Library package来保证高版本SDK的向下兼容。通过使用此包,可以让拥有最新SDK特性的应用运行在API lever 4(即Android 1.6) 及更高版本的设备之上。

在4.0之前Android可辩州以说是没有设计可言的,在4.0之后推出了Android Design,从此Android在设计上有了很大的改善,而在程序实现上相应的就渗灶厅是Holo风格,所以你看到有类似 Theme.Holo.Light Theme.Holo.Light.DarkActionBar 就是4.0的设计风格,但是为了让4.0之前的版本也能有这种风格怎么办呢?这个时候就不得不引用v7包了,所以对应的就有 Theme.AppCompat.Light Theme.AppCompat.Light.DarkActionBar ,如果你的程序最小支持的版本是API14(即Android 4.0),那么可以不用考虑v7的兼容。

Android在5.0版本推出了Material Design的概念,这是Android设计上又一大突破。对应的程序实现上就有 Theme.Material.Light Theme.Material.Light.DarkActionBar 等,但是这种风格只能应用在在5.0版本的手机,如果在5.0之前应用Material Design该怎么办呢?同样的引用appcompat-v7包,这个时候的 Theme.AppCompat.Light Theme.AppCompat.Light.DarkActionBar 就是相对应兼容的Material Design的Theme。

由此可以得出以下情形会导致本文一开始提出的问题。

AndroidManifest.xml文件里面

此时的解决方法有如下几种:

此时再将项目values,values-v11,values-v14目录下的styles.xml文件里面style都改为

3.2 将此目录下的项目导入到Eclipse中

3.3 右键点击我们的Android项目,选择Properties,左侧选择Android,在下方Library框里丛隐点击Add,最后选择appcompat_v7,确定。
此时问题就解决了。

出现此问题的原因是appcompat_v7已经更新到了最新版本并且高于编译环境的SDK版本,此时在Android SDK Manager将SDK及编译工具更新到最高版本

升级完成之后右键点击appcompat_v7项目,选择Properties,选择Project Build Target 为最新版本,这样就OK了。

通过以上的分析,相信朋友们以后再遇到AppCompat相关的问题应该不再是问题了。欢迎大家留言讨论。

纯净日报 https://github.com/laucherish/PureZhihuD
一个采用 RxJava + Retrofit + OkHttp 框架实现的开源软件

阅读全文

与androidapptheme相关的资料

热点内容
我的世界如何编程 浏览:84
vue反编译代码有问题 浏览:948
linuxshell字符串连接字符串 浏览:51
androidviewpager刷新 浏览:438
python编程计算平均分 浏览:678
加密数字货币市值查询 浏览:692
时尚商圈app怎么样 浏览:584
stacklesspython教程 浏览:138
用命令行禁用135端口 浏览:212
linux防火墙编程 浏览:627
pdf阅读器删除 浏览:979
考研人如何缓解压力 浏览:822
买电暖壶哪个app便宜 浏览:505
洛克王国忘记服务器了怎么办 浏览:782
为什么cf登录服务器没反应 浏览:695
服务器如何获取文件列表 浏览:673
creo五轴编程光盘 浏览:14
苹果app网络验证在哪里 浏览:14
博科清空命令 浏览:384
简爱英文pdf 浏览:376