Android知识点之动态布局加载

本文详细介绍了Android应用中UI自适应的设计方法,包括横竖屏切换处理、不同尺寸屏幕自适应处理等内容。针对横竖屏切换,提供了不予处理、禁止转屏、允许切屏但不重启Activity以及切屏自适应等方案;对于不同尺寸屏幕自适应,讲解了通过限定符、使用尺寸限定符及动态设置UI等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常困扰Android开发者的一个问题就是UI的自适应性,Android设备太多,屏幕大小五花八门(哎,还是iOS省心)


一、横竖屏切换处理


1)不予处理

其实一些简单的界面,对于切屏问题可以不做处理,类似只有一个ListView列表等等,默认不处理,切屏是Acitivity重新加载,只要注意处理好内存泄露问题,不予处理不失为一种好方法。


2)禁止转屏

a、简单又霸道,免得切来切去麻烦死了,直接规定只能横屏或竖屏,省心又安心。

b、设置方法

通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。

固定竖屏: android:screenOrientation="portrait"

固定横屏:android:screenOrientation="landscape",为横屏显示。

也可以代码设置:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)


3)允许切屏,但是Activity不重启

a、默认Android设备切屏时候Activity会销毁重启,重新执行OnCreate函数如果不想让Activity重启则可以对Acitivity属性进行设置

b、设置方法

AndroidManifest.xml中对该Activity做如下设置:

android:configChanges="keyboardHidden|orientation|screenSize"

 则在切屏是Acitivity不重启,仅调用 onConfigurationChanged(Configuration newConfig)函数,通过 newConfig.orientation可以判断当前屏幕方向,进而进行相关的操作。


4)切屏自适应

a、获得当前是横屏还是竖屏

          可以通过getWith函数获得屏幕的长和宽,比较大小从而得出当前的状态,横屏还是竖屏,也可以通过getConfiguration()来判断,如下所示。

public class BaseUtil {

	public static  boolean isTabletDevice(Context context) {//判断是不是平板
	    return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
	}
	
	 public static boolean isScreenOriatationPortrait(Context context) {//判断横竖屏
			return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
	}	 
}

b、横竖屏分别布局,在res文件夹下建立layout-land(横屏),layout-port(竖屏)两个文件夹,系统启动时默认根据当前屏幕状态加载相应的布局。

c、切屏时保存当前信息

其实Android系统的UI控件,如EdixtText,都有自己保存当前状态的功能(Google大大牛牛哒),onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据Android为我们提供了onRetainNonConfigurationInstance()方法来暂时保存数据


二、不同尺寸屏幕自适应处理


1)基本概念

屏幕尺寸(in):指屏幕对角线的长度,如有5.0,5.5,6.0等,1英寸 = 2.54cm
屏幕分辨率(单位px):指屏幕在横纵向上的像素点数,单位是px,px英文单词为pixel的缩写,意为像素,通常1px = 1个像素点,如1024*768.
屏幕像素密度(dpi):屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi。
密度无关像素(dp、dip):在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。


2)通过限定符

Android项目res文件夹下建立多个drawable文件夹,分别对应不同的dpi如:

  • drawable-ldpi (dpi=120, density=0.75)

  • drawable-mdpi (dpi=160, density=1)

  • drawable-hdpi (dpi=240, density=1.5)

  • drawable-xhdpi (dpi=320, density=2)

  • drawable-xxhdpi (dpi=480, density=3)

Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,如SDK检测到你手机dpi是160的话会优先到drawable-mdpi文件夹下找对应的图片资源,注意只是优先,假设你手机dpi是160,但是你只在xhpdi文件夹下有对应的图片资源文件,程序一样可以正常运行。所以理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。

使用宽度限定符


3)  使用尺寸限定符

建立多个values文件夹,如values,values-w820dp,values-800x480,单独设置UI参数。


4)获得当前屏幕长度和宽度,动态设置UI

   Display display = this.getWindowManager().getDefaultDisplay();
   	 	width = display.getWidth();
   	 	height=display.getHeight();
   	 	getWindowManager().getDefaultDisplay().getMetrics(displayMertrcs);


5) 判断是不是平板

public class BaseUtil {

	public static  boolean isTabletDevice(Context context) {//判断是不是平板
	    return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
	}	 
}

附上网上看到的一个很清晰的方案图,谁这么牛:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值