Android之屏幕适配

时间:2023-03-03 07:33:49 其他范文 收藏本文 下载本文

Android之屏幕适配(共7篇)由网友“炸鸡51块一斤”投稿提供,以下是小编为大家整理后的Android之屏幕适配,仅供参考,欢迎大家阅读。

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文件夹下

160dp根据上述hdpi dp和px的转换关系1dp = 1.5px,则160dp = 240px,当前控件宽度应该位于屏幕中间位置。

G700(xhdpi):加载dimens.xml资源文件,位于res/value-1280x720文件夹下

180dp根据上述xhdpi dp和px的转换关系1dp = 2px,则180dp = 360px,当前控件宽度应该位于屏幕中间位置。

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获取当前手机的宽高像素值,按比例分配屏幕中控件的宽高以达到适配效果。核心代码如下:

布局文件activity中oncreate核心代码: TextView tv = (TextView) findViewById(R.id.tv); //获取封装当前手机屏幕信息对象,用于存放宽高值 DisplayMetrics metrics = new DisplayMetrics; //给当前屏幕设置宽高 getWindowManager().getDefaultDisplay().getMetrics(metrics); //获取高度 Constant.srceenHeight = metrics.heightPixels; //获取宽度 Constant.srceenWidth = metrics.widthPixels; Log.i(tag, ”Constant.srceenHeight = “+Constant.srceenHeight); Log.i(tag, ”Constant.srceenWidth = “+Constant.srceenWidth); //宽高各占50% RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams((int)(Constant.srceenWidth*0.5+0.5), (int)(Constant.srceenHeight*0.5+0.5)); tv.setLayoutParams(layoutParams);

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(this, android.R.layout.simple_expandable_list_item_1,getData())); setContentView(listView); } private ListgetData(){ Listdata = new ArrayList(); data.add(”测试数据1“); data.add(”测试数据2“); data.add(”测试数据3“); data.add(”测试数据4“); return data; }}

效果

使用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>getData() { List>list = new ArrayList>(); Mapmap = new HashMap(); map.put(”title“, ”标题1“); map.put(”info“, ”内容1“); map.put(”img“, R.drawable.icon_marka); list.add(map); map = new HashMap(); map.put(”title“, ”标题2“); map.put(”info“, ”内容2“); map.put(”img“, R.drawable.icon_markb); list.add(map); map = new HashMap(); map.put(”title“, ”标题3“); map.put(”info“, ”内容3“); map.put(”img“, R.drawable.icon_markc); list.add(map); return 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>mData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mData = getData(); MyAdapter adapter = new MyAdapter(this); setListAdapter(adapter); } private List>getData() { List>list = new ArrayList>(); Mapmap = new HashMap(); map.put(”title“, ”标题1“); map.put(”info“, ”内容1“); map.put(”img“, R.drawable.icon_marka); list.add(map); map = new HashMap(); map.put(”title“, ”标题2“); map.put(”info“, ”内容2“); map.put(”img“, R.drawable.icon_markb); list.add(map); map = new HashMap(); map.put(”title“, ”标题3“); map.put(”info“, ”内容3“); map.put(”img“, R.drawable.icon_markc); list.add(map); return list; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { String string = ”click“ + (String)mData.get(position).get(”title“); Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); } public void showInfo() { new AlertDialog.Builder(this) .setTitle(”我的listview“) .setMessage(”介绍...“) .setPositiveButton(”确定“, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {} }) .show(); } public final class ViewHolder { public ImageView img; public TextView title; public TextView info; public Button viewBtn; } public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; public MyAdapter(Context context) {this.mInflater = LayoutInflater.from(context); } @Override public int getCount() {return mData.size(); } @Override public Object getItem(int arg0) {return null; } @Override public long getItemId(int arg0) {return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.vlist2, null); holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); holder.info = (TextView)convertView.findViewById(R.id.info); holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn); convertView.setTag(holder);}else { holder = (ViewHolder)convertView.getTag();}holder.img.setBackgroundResource((Integer)mData.get(position).get(”img“));holder.title.setText((String)mData.get(position).get(”title“));holder.info.setText((String)mData.get(position).get(”info“));holder.viewBtn.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { showInfo(); }});return convertView; } }}

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(this,android.R.layout.simple_list_item_1, mListStr)); mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { Toast.makeText(SimpleList.this,”您选择了“ + mListStr[position], Toast.LENGTH_LONG).show();} }); }}

效果

使用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>mData= new ArrayList>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); int lengh = mListTitle.length; for(int i =0; i < lengh; i++) {Mapitem = new HashMap();item.put(”title“, mListTitle[i]);item.put(”text“, mListStr[i]);mData.add(item); } SimpleAdapter adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2, new String[]{”title“,”text“},new int[]{android.R.id.text1,android.R.id.text2}); setListAdapter(adapter); mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { Toast.makeText(TitleList.this,”您选择了标题:“ + mListTitle[position] + ”内容:“+mListStr[position], Toast.LENGTH_LONG).show();} }); }}

效果

使用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>mData= new ArrayList>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); int lengh = mListTitle.length; for(int i =0; i < lengh; i++) {Mapitem = new HashMap();item.put(”image“, R.drawable.ic_launcher);item.put(”title“, mListTitle[i]);item.put(”text“, mListStr[i]);mData.add(item); } SimpleAdapter adapter = new SimpleAdapter(this,mData,R.layout.iconlist, new String[]{”image“,”title“,”text“},new int[]{R.id.image,R.id.title,R.id.text}); setListAdapter(adapter); mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { Toast.makeText(IconList.this,”您选择了标题:“ + mListTitle[position] + ”内容:“+mListStr[position], Toast.LENGTH_LONG).show();} }); }}

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{ int mTextViewResourceID = 0; private Context mContext; public MyListAdapter(Context context, int textViewResourceId) {super(context, textViewResourceId);mTextViewResourceID = textViewResourceId;mContext = context; } private int[] colors = new int[] { 0xff626569, 0xff4f5257 }; 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(final int position, View convertView, ViewGroup parent) {ImageView iamge = null;TextView title = null;TextView text = null;Button button = null;if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(mTextViewResourceID, null); iamge = (ImageView) convertView.findViewById(R.id.array_image); title = (TextView) convertView.findViewById(R.id.array_title); text = (TextView) convertView.findViewById(R.id.array_text); button = (Button)convertView.findViewById(R.id.array_button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast.makeText(arrayList,”您点击的第“+position +”个按钮“, Toast.LENGTH_LONG).show(); } });}int colorPos = position % colors.length;convertView.setBackgroundColor(colors[colorPos]);title.setText(mListTitle[position]);text.setText(mListStr[position]);if(colorPos == 0) iamge.setImageResource(R.drawable.icon_st);else iamge.setImageResource(R.drawable.icon_en);return convertView; } }}

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(this, android.R.layout.simple_list_item_checked, getData()));

}

/**自定义选择事件类 */

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 ListgetData() {

Listlist = new ArrayList();

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平板电脑CPU超频技巧

皮尔卡丹发布Android平板电脑 售价450美元

学习android的方法

电脑达人教你2招压缩技巧

app活动策划方案

豆瓣FM产品体验小结交互设计

android自定义组件(手机加速球+水面波动效果)

移动产品设计之常见定位技术交互设计

Android字典造词功能

嵌入式系统的实习报告

Android之屏幕适配
《Android之屏幕适配.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【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

点击下载本文文档