Android获得控件和状态栏高度
### Android获得控件和状态栏高度 在Android应用开发中,有时我们需要获取屏幕上的控件高度以及状态栏的高度。这通常是为了确保应用界面能够正确地适应不同设备的屏幕尺寸和特性,例如为了防止布局被状态栏遮挡或者调整布局使其看起来更加美观。本文将详细介绍如何在Android应用中实现这一功能。 #### 一、获取控件高度 通过提供的代码片段,我们可以看到作者是如何获取一个`TextView`的高度的。以下是对该方法的具体解析: 1. **初始化TextView**: ```java private TextView tv; tv = (TextView) findViewById(R.id.tv); ``` 2. **设置Post回调**: ```java tv.post(new Runnable() { public void run() { init(); } }); ``` - `post()` 方法用于在视图树中注册一个延迟执行的Runnable对象。当视图已经测量完毕并准备好显示时,该Runnable将会被执行。 - `init()` 方法将在Runnable运行时被调用,用于初始化和计算高度。 3. **添加OnPreDraw监听器**: ```java ViewTreeObserver vto = tv.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { int height = tv.getMeasuredHeight(); int width = tv.getMeasuredWidth(); System.out.println(height + "," + width); return true; } }); ``` - `addOnPreDrawListener()` 方法用于添加一个监听器,该监听器会在视图绘制之前被调用。 - 在`onPreDraw()` 方法中,我们可以通过`getMeasuredHeight()` 和 `getMeasuredWidth()` 方法来获取控件的实际高度和宽度,并打印出来。 #### 二、获取状态栏高度 接下来,我们来看如何获取状态栏的高度。这是通过以下步骤完成的: 1. **创建Rect对象**: ```java Rect rect = new Rect(); Window window = getWindow(); tv.getWindowVisibleDisplayFrame(rect); ``` - `getWindowVisibleDisplayFrame()` 方法用于获取可见区域的大小,其中`Rect`对象将填充视图的坐标。 2. **计算状态栏高度**: ```java int statusBarHeight = rect.top; ``` - `rect.top` 的值即为状态栏的高度。 3. **计算标题栏高度**(如果有): ```java int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight = contentViewTop - statusBarHeight; ``` - `Window.ID_ANDROID_CONTENT` 是一个特殊的资源ID,用于查找包含应用内容的视图。 - 通过计算`contentViewTop` 和 `statusBarHeight` 之间的差值,可以得到标题栏的高度。 #### 三、总结 通过以上方法,我们不仅能够准确地获取到特定控件的高度,还能获取到设备的状态栏高度,这对于优化应用UI设计和提高用户体验有着重要的意义。在实际开发过程中,可以根据具体需求灵活运用这些技术,以适应不同的屏幕尺寸和分辨率。 在Android应用开发中,了解如何获取控件高度和状态栏高度是非常有用的技能,它可以帮助开发者更好地控制界面布局,使应用在各种设备上都能呈现出良好的视觉效果。
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.TextView;
public class Test01Activity extends Activity {
/**
* 必须要设置一个View作为参照物
*/
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.tv);
// 必须用这种方法获得。不用得到的数据为0
tv.post(new Runnable() {
public void run() {
init();
}
});
// 获取控件的高度
ViewTreeObserver vto = tv.getViewTreeObserver();
- 鸡蛋2014-05-21很好用,解决了我的问题
- 粉丝: 3
- 资源: 45
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip