Android之屏幕适配(共7篇)由网友“炸鸡51块一斤”投稿提供,以下是小编为大家整理后的Android之屏幕适配,仅供参考,欢迎大家阅读。
篇1:Android之屏幕适配
Android之屏幕适配
Android之屏幕适配 适配方式一图片适配 适配方式二dimensxml文件适配 适配方式三布局文件适配 适配方式四java代码适配 适配方式五权重适配
适配:即当前应用在相同的手机上面显示相同的效果,适配前需要首先确定当前手机所属像素密度类型(如:xhdpi、hdpi、mdpi等),以下已华为G700、模拟器为例,计算其像素密度。
案例一:
手机型号:G700手机分辨率:1280*720 (注:手机两个直角边上分别放置了1280及720个像素点)手机尺寸大小:5英寸(手机斜边长度)假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c计算结果:sqrt(1280*1280+720*720)/5 ≈ 293.72dpi根据google官方文档说明得出,当前手机最接近320dpi,则将其归纳在xhdpi手机范围内,即1dp=2px;
案例二:
手机型号:模拟器手机分辨率:800*480(注:手机两个直角边上分别放置了800及480个像素点)手机尺寸大小:3.7英寸(手机斜边大小)计算结果:sqrt(800*800+480*480)/3.7 ≈ 252.15dpi根据google官方文档(图1-1)得出,当前手机接近240dpi,则将其归纳在hdpi手机范围内,即1dp=1.5px。参照以上方式可将市场上大多数手机划分为5个像素密度等级,分别为:ldpi:120dpi,像素密度与dp转换关系为:1dp = 0.75pxmdpi:160dpi ,像素密度与dp转换关系为:1dp = 1pxhdpi:240dpi,像素密度与dp转换关系为:1dp = 1.5pxxhdpi:320dpi,像素密度与dp转换关系为:1dp = 2pxxxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px
(注:以下案例就当前两款手机进行屏幕适配测试)<?www.2cto.com/kf/ware/vc/“ target=”_blank“ class=”keylink“>vcD4NCjxoMyBpZD0=”适配方式一图片适配“>适配方式一:图片适配
不同像素密度的手机加载工程资源文件(res)中不同资源图片,以上述两款手机为例。布局代码如下:
G700(xhdpi):加载a.jpg资源文件,位于res/drawable-xhdpi文件夹下,显示效果如下:
模拟器(hdpi):加载a.jpg资源文件,位于res/drawable-hdpi文件夹下,显示效果如下:
适配方式二:dimens.xml文件适配
dimens.xml存在于工程资源(res)文件夹中不同values(如:value-1280x720、value-800x480)文件夹下,可用于指定控件大小,不同像素密度手机加载不同values文件夹下的dimens.xml文件,使用方式如下:
模拟器(hdpi):加载dimens.xml资源文件,位于res/value-800x480文件夹下
G700(xhdpi):加载dimens.xml资源文件,位于res/value-1280x720文件夹下
G700(xhdpi)显示效果如下:
模拟器(hdpi)显示效果如下:
适配方式三:布局文件适配
不同分辨率的手机,加载不同的布局文件已达到适配效果。创建多个layout(如:layout-1280x720、layout-800x480)文件夹用于存放不同像素密度手机所需布局文件,
模拟器(hdpi):加载activity_main.xml布局文件,位于res/layout-800x480文件夹下:
G700(xhdpi):加载activity_main.xml布局文件,位于res/layout-1280x720文件夹下:
G700(xhdpi)显示效果如下:
模拟器(hdpi)显示效果如下:
适配方式四:java代码适配
通过android相应api获取当前手机的宽高像素值,按比例分配屏幕中控件的宽高以达到适配效果。核心代码如下:
布局文件
G700(xhdpi)显示效果如下:
模拟器(hdpi)显示效果如下:
适配方式五:权重适配
通过android提供的(权重)剩余空间分配,已达到适配效果。显示界面加载布局文件如下:
G700(xhdpi)显示效果如下:
模拟器(hdpi)显示效果如下:
篇2:Android屏幕计量单位详解
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多,通常不推荐使用这个。
2.dip或dp(与密度无关的像素):一个基于density的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp(与刻度无关的像素):同dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小。
可能很多朋友对dip和px 的区别,不是很清楚,包括我自己之前都没弄清楚,下面简单讨论一下:
首先明确一点:
HVGA屏density=160;QVGA屏density=120;
WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
dip到px的转换公式: px = dip * (density / 160)
Android官方定义dip等价于160dpi屏幕下的一个物理像素点, 即1dip=1px。举例来说, 在 240 dpi 的屏幕上, 1dip 等于 1.5px。
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例:
1.当density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip。
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip;
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip。
2.当density=160时屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip。
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip;
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip。
3.当density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip。
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip;
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip。
在Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):
当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。
下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。
...
android:smallScreens=”true“
android:normalScreens=”true“
android:largeScreens=”true“
android:xlargeScreens=”true“
android:anyDensity=”true“ />
...
附:
系统对屏幕大小和密度分类对照图 :
表 1. Android SDK中包含的模拟器皮肤的屏幕尺寸和密度,以及其他典型的分辨率.
Low density (120), ldpiMedium density (160), mdpiHigh density (240), hdpiExtra high density (320), xhdpiSmall screenQVGA (240x320)480x640Normal screenWQVGA400 (240x400)WQVGA432 (240x432)HVGA (320x480)WVGA800 (480x800)
WVGA854 (480x854)
600x1024640x960Large screenWVGA800** (480x800)
WVGA854** (480x854)WVGA800* (480x800)
WVGA854* (480x854)
600x1024Extra Large screen1024x600WXGA (1280x800)†
1024x768
1280x7681536x1152
1920x1152
1920x1048x1536
2560x1536
2560x1600
* 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度160.
** 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度120.
辅助工具类:
import android.content.Context;
public class DensityUtil {
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
篇3:关于Android引导画面的多分辨率适配
本文并非关于引导画面该采用何种形式、该如何定义信息、有什么注意事项方面的介绍,
本文描述的是,引导画面该如何才能较好的适配各种分辨率,了解此处有助于更好的定义引导画面,以及保持同设计师、工程师的良好沟通。
作为产品人员,需要向不同方向延伸了解一些知识,这些知识能让沟通更顺畅。
这些所了解的知识,可能会有一些错误,当发现问题时,随时更新自己的知识体系。
一、本文提到的引导画面的形式
类似下图,一个引导画面是一屏,左右拖动来切换
图1: 有道云笔记Android 1.2.0引导画面
图2:有道云笔记Android 2.0.0引导画面
二、实现方式之一:底色配合图片缩放
需要知道的是,同一DPI的设备也有不同的分辨率,比如Hdpi最常见的就有480×800和480×854的分辨率,还有其他的,比如480×640、600×1024….
因此,想对不同dpi做一种分辨率的方法,会存在问题。
我尝试用图来说明一下一张图片,如果不做处理在不同机器和不同分辨率上的显示样式:
以Galaxy Nexus为例,屏幕分辨率为720×1280,状态栏为50px,下方虚拟键盘栏为96px,所以实际中间图片大小为720×1134
2.1 在不同分辨率下的显示样式
让我们模拟下此720×1134的引导图在720×1280分辨率的设备上的显示样式如下图:
图A:720×1134的引导图在720×1280设备的显示样式
当我们在一台480×800分辨率的设备上显示时,图片会缩小为480px的宽度显示,此时高度对应会等比缩小为756px显示,假设此时状态栏标准高度为38px,则会空余16px的空间。如果我们设置背景颜色为红色,则此时显示状态如下图:
图B:720×1134的引导图在480×800设备的显示样式
同理,当我们在一台320×480分辨率的设备上显示时,假设此时状态栏标准高度为25px,等比缩放后,图片会缩小为455px(480-25) 的高度显示,此时宽度对应会等比缩小为289px显示,则会空余31px的空间。如果我们设置背景颜色为红色,则此时显示状态如下图:
图C:720×1134的引导图在320×480设备的显示样式
不再继续多举例了,
2.2 适配方案
从上述的例子来看,大图自动缩放后,最大的问题是上下、或左右会留出一些无法填充的位置。
所以,在边缘为纯色的情况下,我们只需要将背景填充为和边缘颜色一样的色值即可。
而且,我们只需要准备较大分辨率的一套,这样可以更好的保证在不同解析度设备上的效果。
2.3 缺陷
下图是在240×320的ldpi设备上的显示效果,如果仔细看,可以看到左右两侧竖向的颜色和中间部分的颜色有一些不一致。
原因还不确定,暂时未有明确结论,猜测可能和android的图像缩小显示机制有关系。
3.4 示例
(1) 有道云笔记Android 2.0.0的引导画面切图
(2) Android 2.0.0中的适配
√ 图片的周边保证是纯色的,这样才能有效的进行不同分辨率的适配。
√ 指定了720×1280的机器为标准参照设备,切出去除了虚拟键盘和状态栏的部分
√ 设定引导界面的背景色为和边缘色一致的颜色
三、实现方式之二:9-Patch
3.1 适配方案
前提:
√ 为了保证四边的缩放效果,边缘需要设定为纯色。
√ 为保证缩放效果,采用xhdpi的图片素材来做9-Patch的原始图片
适配:
√ 在draw 9-patch中,设定图片顶部的左侧和右侧一个像素为拉伸区域,设定图片右侧的顶部和底部一个像素为拉伸区域。
结果:
√ 类似实现方式一的图像示例,只是适配中出现的红色部分,会因为设定了拉伸区域而自动用设定的拉伸区域去填充,从而达到适配效果
3.2 缺陷
目前发现当图片较大时,9-Patch的图片缩放会出现问题,未能按照预期缩放。
3.3 示例
有道云笔记Android 1.2.0的引导画面采用9-Patch的方式实现,见图1
四、实现方式之三:透明引导图
4.1 适配方案
√ 提供背景透明的引导图
√ 提供背景的色值
√ 填充背景色,并放置背景透明的引导图
4.2 缺陷
png的图会比jpg的图大一些
五、小结
方式三是目前倾向采用的方式,本文如有进一步的实践信息,再予以补充。
上述描述和理解中,可能存在错误和问题,如有不当,敬请指出。 (完)
篇4:Android随笔之――Android单元测试
在实际开发中,开发android软件的过程需要不断地进行测试,所以掌握Android的单元测试是极其重要的。您应该把单元测试作为Android应用开发周期的一部分,精心编写的测试可以在开发早起帮你发现错误。
关于Android单元测试可以看Google官方给的教程:Best Practices for Testing(需要FQ)
一、创建Android Test Project
1、创建一个Android Project:Hello。并将其布局文件改成如下:
复制代码
1
2 xmlns:tools=”schemas.android.com/tools“
3 android:layout_width=”match_parent“
4 android:layout_height=”match_parent“
5 android:orientation=”vertical“ >
6
7
8 android:id=”@+id/text“
9 android:layout_width=”match_parent“
10 android:layout_height=”wrap_content“
11 android:text=”@string/hello_world“ />
12
13
14
15 android:id=”@+id/edit“
16 android:layout_width=”match_parent“
17 android:layout_height=”wrap_content“
18 android:hint=”请输入“ />
19
20
复制代码
2、创建Hello对应的测试项目:File->New->Other->Android->Android Test Project,弹出”New Android Test Project”对话框,在”Project Name“中输入“HelloTest”,点击“Next”。
3、在”Select Test Target”中,选中你要测试的Android项目,然后点击Finish即可。
创建完Android Test Project后,打开HelloTest项目的AndroidManifest.xml文件,你会发现里面的配置会比HelloTest多,具体不同请看下面的代码:
复制代码
1
2
3 package=”com.lsj.hello.test“
4 android:versionCode=”1“
5 android:versionName=”1.0“ >
6
7
8
9
10
11
12 android:name=”android.test.InstrumentationTestRunner“
13 android:targetPackage=”com.lsj.hello“ />
14
15
16 android:icon=”@drawable/ic_launcher“
17 android:label=”@string/app_name“ >
18
19
20
21
22
复制代码
二、单元测试代码编写
1、创建完Android Test Project后,你会发现HelloTest自动帮你创建了com.lsj.hello.tests的包名。关于Android单元测试相关包、类、方法的命名方式如下:
包名:com.lsj.example————com.lsj.example.tests//对应包名+”.tests“
类名:Hello.java————HelloTest.java//对应类名+”Test“
方法名:Hello————testHello()//”test“+对应方法名
2、在com.lsj.hello.tests包下建立MainActivityTest.java类,MainActivityTest继承自ActivityInstrumentationTestCase2,关于Android测试类可以看文章末尾的链接
3、编辑MainActivityTest,添加单元测试代码
复制代码
1 package com.lsj.hello.test;
2
3 import android.app.Instrumentation;
4 import android.test.ActivityInstrumentationTestCase2;
5 import android.view.KeyEvent;
6 import android.widget.EditText;
7 import android.widget.TextView;
8
9 import com.lsj.hello.MainActivity;
10
11 /**
12 * ActivityInstrumentationTestCase2继承于TestCase, TestCase类位于junit.framework包下
13 * 查阅Android API文档,可以发现Android的测试类全部继承自TestCase。 创建一个单元测试大致需要以下步骤:
14 *
15 *
16 * 1、继承TestCase类或其子类
17 * 2、定义要使用到的实例变量
18 * 3、使用setUp()方法,在测试前的对变量和测试环境进行初始化
19 * ....测试
20 * 4、在测试完成后进行垃圾回收等善后工作
21 *
22 *
23 * @author Lion
24 */
25 public class MainActivityTest extends
26 ActivityInstrumentationTestCase2
27
28 private MainActivity mActivity;
29 private TextView mTextView;
30 private EditText mEditText;
31 private Instrumentation mInstrumentation;
32
33 /**
34 * 重写MainActivityTest的构造方法,注意super内必须为内的泛型类,否则会报错,
35 * 根据Google官方给的示例,其构造函数为午餐,而且测试的时候发现有参的构造函数会导致单元测试失败。
36 */
37 public MainActivityTest() {
38 super(MainActivity.class);
39 }
40
41 @Override
42 protected void setUp() throws Exception {
43 /* 执行对变量和测试环境的初始化 */
44 super.setUp();
45 // 关闭touch模式,否则key事件会被忽略
46 setActivityInitialTouchMode(false);
47
48 mInstrumentation = getInstrumentation();
49
50 // 获取被测试的MainActivity
51 mActivity = this.getActivity();
52 // 获取被测试的TextView控件
53 mTextView = (TextView) mActivity.findViewById(com.lsj.hello.R.id.text);
54 // 获取被测试的EditText控件
55 mEditText = (EditText) mActivity.findViewById(com.lsj.hello.R.id.edit);
56 }
57
58 /**
59 * 测试数据初始化是否为空
60 */
61 public void testInit() {
62 // 断言mActivity是否为空
63 assertNotNull(mActivity);
64 // 断言mTextView是否为空
65 assertNotNull(mTextView);
66 // 断言mEditText是否为空
67 assertNotNull(mEditText);
68 }
69
70 /**
71 * 测试文本框字符串是否相等
72 */
73 public void testTextViewString() {
74 // 断言mTextView显示的文本是否与String.xml中的hello_world相等
75 assertEquals(
76 mActivity.getResources().getString(
77 com.lsj.hello.R.string.hello_world), mTextView
78 .getText().toString());
79 }
80
81 /**
82 * 测试输入
83 */
84 public void testEditTextInput() {
85 input();
86 assertEquals(”hello“, mEditText.getText().toString());
87 }
88
89 /**
90 * 模拟输入
91 */
92 public void input() {
93 /* UI组件的相关操作需要在UI线程上进行,所以用Activity的runOnUiThread方法 */
94 mActivity.runOnUiThread(new Runnable() {
95 @Override
96 public void run() {
97 mEditText.requestFocus();
98 mEditText.performClick();
99 }
100 });
101 /*
102 * 由于测试用例在单独的线程上执行,所以此处需要同步application,
103 * 调用waitForIdleSync等待测试线程和UI线程同步,才能进行输入操作。
104 * waitForIdleSync和sendKeys不允许在UI线程里运行
105 */
106 mInstrumentation.waitForIdleSync();
107 // 调用sendKeys方法,输入
108 sendKeys(KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,
109 KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O);
110 }
111
112 @Override
113 protected void tearDown() throws Exception {
114 /* 在测试完成后进行垃圾回收等工作 */
115 super.tearDown();
116 }
117 }
篇5:Android之ListView设置
Android开发中,我们常使用到ListView视图,下面介绍ListView的几种使用方法,
主界面
首先,在主界面上添加几个按钮,用于界面跳转。
界面布局:
源码:
package com.example.listviewdemo;import android.os.Bundle;import android.view.View;import android.app.Activity;import android.content.Intent;public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void Button1(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity01.class); startActivity(intent); } public void Button2(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity02.class); startActivity(intent); } public void Button3(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity03.class); startActivity(intent); } public void Button4(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, SimpleList.class); startActivity(intent); } public void Button5(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, TitleList.class); startActivity(intent); } public void Button6(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, IconList.class); startActivity(intent); } public void Button7(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, ColorList.class); startActivity(intent); } public void Button8(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, ArrayList.class); startActivity(intent); } public void Button9(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, MyTest.class); startActivity(intent); }}
效果:
使用ListView设置界面
package com.example.listviewdemo;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class Activity01 extends Activity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); listView.setAdapter(new ArrayAdapter
效果
使用SimpleAdapter设置界面
package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.widget.SimpleAdapter;public class Activity02 extends ListActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist, new String[]{”title“,”info“,”img“}, new int[]{R.id.title,R.id.info,R.id.img}); setListAdapter(adapter); } private List
vlist布局
效果
使用MyAdapter设置界面
package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.AlertDialog;import android.app.ListActivity;import android.content.Context;import android.content.DialogInterface;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class Activity03 extends ListActivity{ private List
vlist2布局
效果
使用ListActivity设置一行内容界面
package com.example.listviewdemo;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class SimpleList extends ListActivity{ private String[] mListStr = {”标题1:内容1“,”标题2:内容2“,”标题3:内容3“,”标题4:内容4“}; ListView mListView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); setListAdapter(new ArrayAdapter
效果
使用ListActivity设置两行内容界面
package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class TitleList extends ListActivity{ private String[] mListTitle = { ”标题1“, ”标题2“, ”标题3“, ”标题4“, ”标题5“}; private String[] mListStr = { ”内容1“, ”内容2“, ”内容3“, ”内容4“, ”内容5“ }; ListView mListView = null; ArrayList
效果
使用ListActivity设置图标和两行内容界面
package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class IconList extends ListActivity{ private String[] mListTitle = { ”标题1“, ”标题2“, ”标题3“, ”标题4“, ”标题5“}; private String[] mListStr = { ”内容1“, ”内容2“, ”内容3“, ”内容4“, ”内容5“ }; ListView mListView = null; ArrayList
iconlist布局
效果
使用ListActivity设置背景图标文字效果
package com.example.listviewdemo;import android.app.ListActivity;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class ColorList extends ListActivity{ private String[] mListTitle = { ”标题1“, ”标题2“, ”标题3“, ”标题4“, ”标题5“}; private String[] mListStr = { ”内容1“, ”内容2“, ”内容3“, ”内容4“, ”内容5“ }; ListView mListView = null; MyListAdapter myAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); myAdapter = new MyListAdapter(this); setListAdapter(myAdapter); mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { View v=adapterView.getChildAt(position); v.setBackgroundColor(Color.RED); Toast.makeText(ColorList.this,”您选择了“ + mListStr[position], Toast.LENGTH_LONG).show();} }); } class MyListAdapter extends BaseAdapter { private int[] colors = new int[] { 0xff626569, 0xff4f5257 }; public MyListAdapter(Context context) {mContext = context; } public int getCount() {return mListStr.length; } @Override public boolean areAllItemsEnabled() {return false; } public Object getItem(int position) {return position; } public long getItemId(int position) {return position; } public View getView(int position, View convertView, ViewGroup parent) {ImageView iamge = null;TextView title = null;TextView text = null;if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.colorlist, null); iamge = (ImageView) convertView.findViewById(R.id.color_image); title =(TextView) convertView.findViewById(R.id.color_title); text= (TextView) convertView.findViewById(R.id.color_text);} int colorPos = position % colors.length;convertView.setBackgroundColor(colors[colorPos]);title.setText(mListTitle[position]);text.setText(mListStr[position]);iamge.setImageResource(R.drawable.icon_gcoding);return convertView; } private Context mContext; }}
colorlist布局
效果
使用ListActivity设置背景按钮图标文字效果
package com.example.listviewdemo;import android.app.ListActivity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class ArrayList extends ListActivity{ private String[] mListTitle = { ”标题1“, ”标题2“, ”标题3“, ”标题4“, ”标题5“}; private String[] mListStr = { ”内容1“, ”内容2“, ”内容3“, ”内容4“, ”内容5“ }; ListView mListView = null; MyListAdapter myAdapter = null; ArrayList arrayList = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); arrayList = this; mListView = getListView(); myAdapter = new MyListAdapter(this,R.layout.arraylist); setListAdapter(myAdapter); } public class MyListAdapter extends ArrayAdapter
arraylist布局
效果
使用ListView设置界面跳转
第一个界面
package com.example.listviewdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class MyTest extends Activity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); listView.setAdapter(new DemoListAdapter()); setContentView(listView); listView.setOnItemClickListener(new OnItemClickListener() { @Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { onListItemClick(position); } }); } void onListItemClick(int index) { Intent intent = null; intent = new Intent(this,demos[index].demoClass); startActivity(intent); } private static final DemoInfo[] demos = { new DemoInfo(R.string.title1, R.string.content1, MyTest2.class), new DemoInfo(R.string.title2, R.string.content2, MyTest2.class), new DemoInfo(R.string.title3, R.string.content3, MyTest2.class), }; private class DemoListAdapter extends BaseAdapter { public DemoListAdapter() { super(); } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(MyTest.this, R.layout.list, null); TextView title = (TextView)convertView.findViewById(R.id.title); TextView desc = (TextView)convertView.findViewById(R.id.info); title.setText(demos[position].title); desc.setText(demos[position].desc); return convertView; } @Override public int getCount() { return demos.length; } @Override public Object getItem(int position) { return demos[position]; } @Override public long getItemId(int position) { return position; } } private static class DemoInfo { private final int title; private final int desc; private final ClassdemoClass; public DemoInfo(int title, int desc, ClassdemoClass) { this.title = title; this.desc = desc; this.demoClass = demoClass; } }}
第二个界面
package com.example.listviewdemo;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MyTest2 extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = new View(this); setContentView(view); }}
list布局
效果
篇6:Android常用UI之Spinner
在做应用时,经常要用到下拉列表选择操作,比如我们点击下拉列表选择省市区,选择性别等,我们可以用多种方法实现,比如可以用ListView显示数据,再用onItemClickListner事件来处理选择操作。不过更好的选择是用Android自带的下拉列表控件Spinner。
--------------------------超简单布局--------------------------------------------------
xmlns:tools=”schemas.android.com/tools“
android:layout_width=”match_parent“
android:layout_height=”match_parent“
android:orientation=”vertical“ >
android:id=”@+id/view_city“
android:layout_width=”match_parent“
android:layout_height=”wrap_content“
android:text=”@string/hello_world“ />
android:id=”@+id/my_pinner“
android:layout_width=”fill_parent“
android:layout_height=”wrap_content“ />
-------------------------代码实现------------------------------------
public class MainActivity extends Activity {
/**文字显示TextView*/
private TextView mTextView;
/**下拉列表Spinner */
private Spinner mSpinner;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById();
}
/**初始化控件*/
private void findViewById() {
mTextView = (TextView) findViewById(R.id.view_city);
mSpinner = (Spinner) findViewById(R.id.my_spinner);
mSpinner.setOnItemSelectedListener(new DefultOnItemSelectedListener());
mSpinner.setAdapter(new ArrayAdapter
}
/**自定义选择事件类 */
class DefultOnItemSelectedListener implements Spinner.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterViewparent, View view, int position, long id) {
mTextView.setText(parent.getItemAtPosition(position).toString());
}
@Override
public void onNothingSelected(AdapterViewparent) {
//暂未处理
}
};
/**设置些初始数据*/
private List
List
for (int i = 0; i < 10; i++) {
list.add(”ldm_“ + i);
}
return list;
}
}
篇7:android 程序中禁止屏幕旋转和重启Activity
禁止屏幕随手机旋转变化
有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:
在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation=”landscape”属性,
landscape = 横向
portrait = 纵向
避免在转屏时重启Activity
android中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上 android:configChanges=”keyboardHidden|orientation”属性),
在需要控制屏幕显示方向的Activity中重写 onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。
@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) { //横向 setContentView(R.layout.file_list_landscape); } else { //竖向 setContentView(R.layout.file_list); }}
在模拟器中可以按 CTL+F11 模拟做屏幕旋转。
【Android之屏幕适配(共7篇)】相关文章:
如何设置显卡的电源管理2022-04-30
笔试题目22024-05-05
项目开发总结报告(GB8567――88)2022-05-02
销售简历项目经验范文2023-10-01
星座成“80后”面试“宝典”2022-10-09
产品规范之道交互设计2023-06-27
美图贴贴Android1.2.0全新上线,给你不一样的卖萌体验!2022-11-24
如何让非红米系列手机也有极简模式网络技巧2023-09-27
计算机行业实习报告2023-08-31
HTML5开发工程师岗位的具体职责概述2022-12-19