【攻克Android (21)】屏幕适配、主题、样式

[b][size=large]本文围绕以下三个部分展开: [/size][/b]

[b][size=large]一、屏幕适配[/size][/b]
[size=medium][b]案例:获取屏幕规格(宽度和高度,像素)[/b][/size]
[b][size=large]二、主题[/size][/b]
[b][size=large]三、样式[/size][/b]
[size=medium][b]附 代码补充[/b][/size]


[b][size=large]一、屏幕适配[/size][/b]

[size=medium][b]1. 屏幕尺寸(Screen size)[/b][/size]

[size=medium]屏幕的对角线长度(英寸)。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5854/7cdd5c62-dc45-333a-b6bf-bc3599008962.png[/img][/align]

[size=medium][b]2. 屏幕分辨率(Screen size)[/b][/size]

[size=medium]屏幕水平方向和垂直方向上像素数量(px)。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5858/9f8988fd-b7a2-3e1f-8170-9b8257978d8c.png[/img][/align]

[size=medium][b]3. 像素密度(pixel density)[/b][/size]

[size=medium]一英寸内像素的数量:DPI (Dots Per Inch)。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5860/7bbffd76-bd8f-3909-aca9-3c7ef7391d91.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5862/20a38f95-c333-336a-b993-e45a33807939.png[/img][/align]

[size=medium]补充:PPI和DPI的区别:[/size]

[size=medium](1)PPI (Pixels Per Inch):图像的采样率。表示的是每英寸所拥有的像素(Pixel)数目。PPI数值越高,即代表显示屏能够以越高的密度显示图像。当然,显示的密度越高,拟真度就越高。[/size]

[size=medium](2)DPI (Dots Per Inch):输出分辨,针对于输出设备而言的。[/size]

[size=medium][b]4. 虚拟独立像素(Device Independent Pixels, DIP或dp)[/b][/size]

[size=medium]DIP 以 MDPI(160dpi)为基准,相同的 dp 在不同设备上看起来大小一致。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5864/34a78566-61af-3981-bb08-cbaa345fb5b3.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5866/ecb87d73-502d-3027-b521-88d8a2ad913d.png[/img][/align]

[size=medium][b]5. 图标适配设备[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5868/c646d65b-f84b-37cb-b3f0-8c90a5b6d0b9.png[/img][/align]

[size=medium][b]6. 布局适配设备[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5870/d024394b-455a-3d32-a61d-7e5b69b2d614.png[/img][/align]

[size=medium][b]7. 手指在屏幕上的最小触控区域[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5872/200cfc78-735b-324d-9696-d5857b492b35.png[/img][/align]

[size=medium][b]8. 最佳实践[/b][/size]

[size=medium](1)使用 DIP(dp) 定义控件的尺寸。[/size]

[size=medium](2)使用 SP(Scale-independent pixels) 定义字体的尺寸。[/size]

[size=medium](3)需要制作多套图标使用于不同的像素密度。[/size]

[size=medium](4)屏幕上最小的触控区域为 48 dp 。[/size]


[size=medium][b]案例:获取屏幕规格(宽度和高度,像素)[/b][/size]

[size=medium]创建一个 Module ,在 MainActivity 的 onCreate() 方法中,获取屏幕规格:[/size]

// 1.获得屏幕的规格
DisplayMetrics dm = this.getResources().getDisplayMetrics();
// 1.1 获得屏幕的宽度 (像素,如 480px)
int screenWidth = dm.widthPixels;
// 1.2 获得屏幕的高度 (像素,如 800px):从通知栏下面开始,从屏幕底端
int screenHeight = dm.heightPixels;
// 1.3 格式化字符串,显示屏幕高度、宽度
String text = String.format("Screen Width=%d, Screen Height=%d",
screenWidth,screenHeight);
// 1.4 用日志输出
Log.v("TAG", text);


[size=medium]用日志输出后,查看屏幕规格的方法如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5874/2176fb82-e207-3098-9696-6c20f9ca2d5a.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5876/cb5b7c97-d80c-3e4f-b671-0acf154c95d6.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/5878/3717ff28-7fa7-39d8-b50d-c06ae9cae88d.png[/img][/align]

[size=medium] MainActivity 代码如下:[/size]

package com.android.themestyle;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 1.获得屏幕的规格
DisplayMetrics dm = this.getResources().getDisplayMetrics();
// 1.1 获得屏幕的宽度 (像素,如 480px)
int screenWidth = dm.widthPixels;
// 1.2 获得屏幕的高度 (像素,如 800px):从通知栏下面开始,从屏幕底端
int screenHeight = dm.heightPixels;
// 1.3 格式化字符串,显示屏幕高度、宽度
String text = String.format("Screen Width=%d, Screen Height=%d",
screenWidth, screenHeight);
// 1.4 用日志输出
Log.v("TAG", text);
// 06-17 09:18:08.856 15267-15267/com.android.themestyle V/TAG﹕ Screen Width=1080, Screen Height=1920
}

// ---------------------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}



[b][size=large]二、主题[/size][/b]

[size=medium][b]1. 默认的主题如下:[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6039/26c9264e-7de9-3cae-a6e7-2d42f9ff5b1e.png[/img][/align]

[size=medium]其中,功能清单文件 AndroidManifest.xml 中引用了如下默认主题:AppTheme ,该主题位于 styles.xml 中。 [/size]

android:theme="@style/AppTheme"


[size=medium]AndroidManifest.xml 代码如下:[/size]

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".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>
<activity
android:name=".ShapeActivity"
android:label="@string/title_activity_shape"
android:parentActivityName=".MainActivity"/>
<activity
android:name=".StateActivity"
android:label="@string/title_activity_state"
android:parentActivityName=".MainActivity"/>
<activity
android:name=".StyleActivity"
android:label="@string/title_activity_style"
android:parentActivityName=".MainActivity"/>
</application>

</manifest>


[size=medium]styles.xml 中 默认主题的设置信息如下: [/size]

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>

</resources>


[size=medium][b]2. 修改后的主题如下:[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6041/e7b0758a-7f9a-3f0a-bf11-d6a5c871c385.png[/img][/align]

[size=medium](1)在 styles.xml 中,自定义一个应用栏样式:MyActionBar ,将应用栏的背景颜色改为:红色。[/size]

<!--
应用栏样式:
继承了父类样式:@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse
-->
<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
<item name="android:background">@android:color/holo_red_light</item>
</style>


[size=medium](2)在 styles.xml 中,自定义一个主题:CustomActionBarTheme ,其父类主题是 默认主题 AppTheme,其应用栏使用刚刚自定义的 MyActionBar。(除了应用栏使用自定义的 MyActionBar,其他部分都和父类主题一样)。[/size]

<!--
此主题可应用到 整个 App,也可以应用到 单个 Activity
-->
<style name="CustomActionBarTheme" parent="@style/AppTheme">
<item name="android:actionBarStyle">@style/MyActionBar</item>
</style>


[size=medium](3)在 功能清单文件 AndroidManifest.xml 中,将此App的主题改为:CustomActionBarTheme 。[/size]

android:theme="@style/CustomActionBarTheme"


[size=medium]这样,整个 App 的主题中,应用栏都变为了红色背景。[/size]

[size=medium]主题也可应用于 单个 Activity,如:在 StyleActivity 中,加入 默认样式:AppTheme,这样,StyleActivity 的应用栏变为了默认的背景,其他页面的应用栏均为红色背景。[/size]

android:theme="@style/AppTheme"


[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6072/3273e6f6-90e6-3281-9785-a52e9fc83f4f.jpg[/img][/align]

[size=medium]AndroidManifest.xml 代码如下:[/size]

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/CustomActionBarTheme">
<activity
android:name=".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>
<activity
android:name=".ShapeActivity"
android:label="@string/title_activity_shape"
android:parentActivityName=".MainActivity"/>
<activity
android:name=".StateActivity"
android:label="@string/title_activity_state"
android:parentActivityName=".MainActivity"/>
<activity
android:name=".StyleActivity"
android:label="@string/title_activity_style"
android:parentActivityName=".MainActivity"
android:theme="@style/AppTheme"/>
</application>

</manifest>



[b][size=large]三、样式[/size][/b]

[size=medium][b]1. 形状样式(Shape):[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6078/f37171ee-d4c8-363b-badd-03b28cf2ee8b.jpg[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6094/4bb11352-8d95-362c-8aa7-c9e1a8bee697.jpg[/img][/align]

[size=medium][b](1)“有背景的按钮(填充色)”:android:background:solid_shape 。[/b][/size]

[size=medium](A)在 res/drawable 下面,创建 solid_shape.xml 。里面写样式。[/size]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--3.
3.1 圆角矩形-->
<corners android:radius="4dp"/>

<!--3.2 边框-->
<stroke android:width="4dp"
android:color="#C1E1A6"/>

<!--3.3 填充颜色-->
<solid android:color="#118C4E"/>

<!--3.4 内边距-->
<padding
android:bottom="16dp"
android:left="16dp"
android:right="16dp"
android:top="16dp"/>
</shape>


[size=medium]效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6096/cfc08762-40e2-386a-aaf8-7bcdeb57ca01.png[/img][/align]

[size=medium](B)将此样式作用于 activity_shape.xml 中的“有背景的按钮(填充色)”按钮:[/size]

android:background="@drawable/solid_shape"


[size=medium]“有背景的按钮(填充色)”按钮 代码如下:[/size]

<!--
3.5 android:background="@drawable/solid_shape"
-->
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(填充色)"
android:background="@drawable/solid_shape"
android:textColor="@android:color/white"/>


[size=medium][b](2)“有背景的按钮(过滤色)”:android:background:gradient_shape 。[/b][/size]

[size=medium](A)在 res/drawable 下面,创建 gradient_shape.xml 。里面写样式。[/size]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--3.
3.1 圆角矩形-->
<corners android:radius="4dp" />

<!--3.2 边框-->
<stroke
android:width="4dp"
android:color="#C1E1A6" />

<!--3.3 填充颜色
gradient 梯度,坡度,倾斜度
angle 角度,角。 默认:0,从左到右渐变
90:从下到上渐变
180:从右到左渐变
270:从上到下渐变
最小角度:45度:从左下到右上
度数:45度的倍数。逆时针旋转(共有8个方向)
-->
<gradient
android:angle="45"
android:endColor="@android:color/white"
android:startColor="#0078a5" />

<!--3.4 内边距-->
<padding
android:bottom="16dp"
android:left="16dp"
android:right="16dp"
android:top="16dp" />
</shape>


[size=medium]效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6098/cced1652-d725-3146-bc6e-2f411a162858.png[/img][/align]

[size=medium](B)将此样式作用于 activity_shape.xml 中的“有背景的按钮(过滤色)”按钮:[/size]

android:background="@drawable/gradient_shape"


[size=medium]“有背景的按钮(过滤色)”按钮 代码如下:[/size]

<!--
3.5 android:background="@drawable/gradient_shape"
-->
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(过渡色)"
android:background="@drawable/gradient_shape"
android:textColor="@android:color/white"/>


[size=medium][b](3)“有背景的按钮(辐射色)”:android:background:radius_shape 。[/b][/size]

[size=medium](A)在 res/drawable 下面,创建 radius_shape.xml 。里面写样式。[/size]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--3.
3.1 圆角矩形-->
<corners android:radius="4dp"/>

<!--3.2 边框-->
<stroke android:width="4dp"
android:color="#C1E1A6"/>

<!--3.3 填充颜色
gradient 梯度,坡度,倾斜度
-->
<gradient
android:endColor="@android:color/holo_blue_light"
android:gradientRadius="100dp"
android:startColor="@android:color/holo_orange_light"
android:type="radial"/>

<!--3.4 内边距-->
<padding
android:bottom="16dp"
android:left="16dp"
android:right="16dp"
android:top="16dp"/>
</shape>


[size=medium]效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6100/4a12b50a-6c7b-3ce1-b999-1fa4b910151b.png[/img][/align]

[size=medium](B)将此样式作用于 activity_shape.xml 中的“有背景的按钮(辐射色)”按钮:[/size]

android:background="@drawable/radius_shape"


[size=medium]“有背景的按钮(辐射色)”按钮 代码如下:[/size]

<!--
3.5 android:background="@drawable/radius_shape"
-->
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button2"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(辐射色)"
android:background="@drawable/radius_shape"
android:textColor="@android:color/white"/>


[size=medium][b](4)“环形”文本:android:background:ring_shape 。[/b][/size]

[size=medium](A)在 res/drawable 下面,创建 ring_shape.xml 。里面写样式。[/size]

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:useLevel="false">
<gradient
android:centerColor="@android:color/white"
android:endColor="#660000ff"
android:startColor="#66ff0000"
android:type="sweep"
android:useLevel="false"/>
</shape>


[size=medium]效果如下:[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6102/e071aff9-0e0e-3030-a51d-2aa0516d92d9.png[/img][/align]

[size=medium](B)将此样式作用于 activity_shape.xml 中的“环形”文本:[/size]

android:background="@drawable/ring_shape"


[size=medium]“环形”文本 代码如下:[/size]

<!--
3.5 android:background="@drawable/ring_shape"
-->
<TextView
android:id="@+id/textView"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentStart="true"
android:layout_below="@+id/button3"
android:gravity="center"
android:text="环形"
android:background="@drawable/ring_shape"
android:textSize="20sp"/>


[size=medium][b]注意:[/b][/size]
[size=medium]以上四个样式,里面的节点都是“<shape></shape>”[/size]


[size=medium][b]附 代码补充[/b][/size]

[size=medium][b]activity_shape.xml:[/b][/size]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.themestyle.ShapeActivity">
<!--
android:background:solid_shape
android:background:gradient_shape
android:background:radius_shape
android:background:ring_shape
-->
<!--
3.5 android:background="@drawable/solid_shape"
-->
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(填充色)"
android:background="@drawable/solid_shape"
android:textColor="@android:color/white"/>

<!--
3.5 android:background="@drawable/gradient_shape"
-->
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(过渡色)"
android:background="@drawable/gradient_shape"
android:textColor="@android:color/white"/>

<!--
3.5 android:background="@drawable/radius_shape"
-->
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button2"
android:layout_marginBottom="20dp"
android:text="有背景的按钮(辐射色)"
android:background="@drawable/radius_shape"
android:textColor="@android:color/white"/>

<!--
3.5 android:background="@drawable/ring_shape"
-->
<TextView
android:id="@+id/textView"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentStart="true"
android:layout_below="@+id/button3"
android:gravity="center"
android:text="环形"
android:background="@drawable/ring_shape"
android:textSize="20sp"/>

</RelativeLayout>



[size=medium][b]2. 按钮点击样式:[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6104/63d54755-54c1-3cb3-9bc4-584a917423ad.jpg[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6106/f394f631-16ae-3b69-811e-3c9b4cd28307.jpg[/img][/align]

[size=medium](1)Button 样式:使用 drawable 下面创建的样式文件。(使用这种方法,界面上的英文全部显示大写)[/size]
[size=medium]使用这种方法,需要直接在界面布局中,引用背景样式文件:button_bg.xml,样式较少,且较为固定。[/size]

android:background="@drawable/button_bg"


[size=medium]最上面的按钮,默认出现的样式是 solid_shape,当点击此按钮的时候,变为如下样式:gradient_shape 。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6108/56d3a7f6-d3f3-3eed-8c46-0d6cd060a86a.png[/img][/align]

[size=medium](A)在 res/drawable 下面,创建 button_bg.xml 。里面写样式。[/size]

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--4.1 -->
<item
android:drawable="@drawable/gradient_shape"
android:state_pressed="true"/>
<item android:drawable="@drawable/solid_shape"/>
</selector>


[size=medium][b]注意:[/b][/size]
[size=medium]里面的节点是“<selector></selector>”[/size]

[size=medium](B)将此样式作用于 activity_state.xml 中的第一个按钮:[/size]

android:background="@drawable/button_bg"


[size=medium]activity_state.xml 中的第一个按钮 代码如下:[/size]

<!--
4.2 android:background="@drawable/button_bg"
-->
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="New Button"
android:background="@drawable/button_bg"
android:textColor="@android:color/white"/>


[size=medium](2)Button 样式:利用 styles.xml 样式文件。(使用这种样式,界面上的英文不再是全部显示大写,而是按照原样输出)[/size]
[size=medium]使用这种方法,只需要直接在界面布局中,引用样式文件:styles.xml 中定义的样式,样式较多,且比较自由、更新方便。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6110/dfe50b05-3e03-349f-95d2-087ae7a6c2be.png[/img][/align]

[size=medium](A)在 styles.xml 中,自定义 Button 样式:[/size]

<!--
4.3 Button 样式:
这儿,背景使用了 button_bg,
此外,还可以设置 字体颜色、字体大小、字体位置等属性。
其父类样式是 Widget.Button 。
-->
<style name="myButton" parent="@android:style/Widget.Button">
<item name="android:textColor">@drawable/button_text_color</item>
<item name="android:background">@drawable/button_bg</item>
<item name="android:textSize">20sp</item>
<item name="android:gravity">center</item>
</style>


[size=medium](B)这里面用到了 设置字体颜色 的一个样式,因此需要在 drawable 下面再创建 button_text_color.xml,并写入 字体颜色的设置样式:[/size]

<?xml version="1.0" encoding="utf-8"?>
<!--4.4 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white"
android:state_pressed="true"/>
<item android:color="@android:color/darker_gray"/>
</selector>


[size=medium](C)对 activity_state.xml 中下面的两个按钮,设置此样式:[/size]

style="@style/myButton"


[size=medium]其中,两个按钮 的代码如下:[/size]

<!--
4.5 style="@style/myButton"
-->
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button4"
android:layout_marginTop="39dp"
style="@style/myButton"
android:text="New Button"/>

<!--
4.5 style="@style/myButton"
-->
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/button5"
style="@style/myButton"
android:text="New Button"/>



[size=medium][b]附 代码补充[/b][/size]

[size=medium][b](1)activity_shape.xml:[/b][/size]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.themestyle.StateActivity">

<!--4.-->
<!-- background:button_bg
style:myButton
style:myButton
-->

<!--
4.2 android:background="@drawable/button_bg"
-->
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="New Button"
android:background="@drawable/button_bg"
android:textColor="@android:color/white"/>

<!--
4.5 style="@style/myButton"
-->
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/button4"
android:layout_marginTop="39dp"
style="@style/myButton"
android:text="New Button"/>

<!--
4.5 style="@style/myButton"
-->
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/button5"
style="@style/myButton"
android:text="New Button"/>

</RelativeLayout>


[size=medium][b](2)styles.xml:[/b][/size]

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>

<!--
2.2 此主题可应用到 整个 App,也可以应用到 单个 Activity
-->
<style name="CustomActionBarTheme" parent="@style/AppTheme">
<item name="android:actionBarStyle">@style/MyActionBar</item>
</style>

<!--
2. 样式
2.1 应用栏样式
-->
<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
<item name="android:background">@android:color/holo_red_light</item>
</style>

<!--
4.3 Button 样式:
这儿,背景使用了 button_bg,
此外,还可以设置 字体颜色、字体大小、字体位置等属性。
其父类样式是 Widget.Button 。
-->
<style name="myButton" parent="@android:style/Widget.Button">
<item name="android:textColor">@drawable/button_text_color</item>
<item name="android:background">@drawable/button_bg</item>
<item name="android:textSize">20sp</item>
<item name="android:gravity">center</item>
</style>
</resources>



[size=medium][b]3. 列表框中列表项点击样式(Shape):[/b][/size]

[size=medium]不点击的时候,背景颜色是:透明的(无背景颜色)。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6121/08896bf1-d09c-3f7c-afd0-747edd7c791a.jpg[/img][/align]

[size=medium]点击按住不离开的时候,背景颜色变为:holo_orange_dark。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6123/16eb559d-cc4d-387f-957f-2193501d546a.png[/img][/align]

[size=medium]点击完成,离开后,激活项的背景颜色变为:holo_blue_light。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6125/7c79ccdc-996f-3cc7-8bb6-12c9a9a70e88.png[/img][/align]

[size=medium](1)StyleActivity 。[/size]

package com.android.themestyle;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
* 5.1
*/
public class StyleActivity extends Activity {
/*
5.1.1 声明变量
*/
private ListView listView;
// 数据(数组)
private String[] data = {"C", "C++", "Objective-C", "Java", "Go", "Rust", "Swift"};
// 数组适配器
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 此活动与界面进行绑定
setContentView(R.layout.activity_style);
/*
5.1.2 初始化变量
*/
// 找到 listView列表框
listView = (ListView) findViewById(R.id.listView2);
/*
5.1.3 将 layout\activity_style 中的列表项
与 layout\list_item 下面的 TextView 对应绑定
*/
// 将 数组中的每一个数据,绑定对应于 layout\list_item 下面的 每一个 TextView (id:text)
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.text, data);
// 将适配器与 listView列表框绑定。
// (即:layout\list_item 下面的 每一个 TextView,与 listView列表框中的列表项 对应)
listView.setAdapter(adapter);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_style, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}


[size=medium](2)activity_style.xml 。主页面 listView列表框[/size]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.themestyle.StyleActivity">
<!--
5.2 主页面 listView列表框
-->
<ListView
android:id="@+id/listView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:choiceMode="singleChoice"/>

</RelativeLayout>


[size=medium](3)layout\list_item.xml 。将来要与 listView 列表框的 列表项 一一绑定 的 TextView 布局。[/size]

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

<!--
5.3 每个 TextView文本 都 使用了 drawable 下面的背景样式:
background:list_item
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="@drawable/list_item"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="8dp">

<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="New Text"
android:textSize="20sp" />
</LinearLayout>


[size=medium](4)drawable\list_item.xml 。列表项点击时的样式[/size]

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

<!--
5.4 不点击的时候,背景颜色是:透明的(无背景颜色)。
点击按住不离开的时候,背景颜色变为:holo_orange_dark。
点击完成,离开后,激活项的背景颜色变为:holo_blue_light。
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_orange_dark"
android:state_pressed="true"/>
<item android:drawable="@android:color/holo_blue_light"
android:state_activated="true"/>
<item android:drawable="@android:color/transparent"/>
</selector>



[size=medium][b]附 代码补充[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6127/59a5b1df-aa1c-3019-bcce-6f9507df60d5.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0109/6129/1167b997-b05f-3e98-befe-d70df9dbfa88.png[/img][/align]

[size=medium]1. menu_main.xml:[/size]

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>


[size=medium]2. menu_shape.xml:[/size]

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.android.themestyle.ShapeActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>


[size=medium]3. menu_state.xml:[/size]

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.android.themestyle.StateActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>


[size=medium]4. menu_style.xml:[/size]

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.android.themestyle.StyleActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值