Android利用反射获取状态栏(StatusBar)高度

MainActivity如下:

package cc.teststatusbarheight;
import java.lang.reflect.Field;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Context;
/**
 * Demo描述:
 * 利用反射获取状态栏StatusBar的高度
 *
 * 反射基础:
 * http://blog.csdn.net/lfdfhl/article/details/10311505
 *
 * 参考资料:
 * http://blog.csdn.net/lilu_leo/article/details/10211327
 * http://blog.csdn.net/dany1202/article/details/6571010
 * Thank you very much
 */
public class MainActivity extends Activity {
    private Button mButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init(){
		mButton=(Button) findViewById(R.id.button);
		mButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				getStatusBarHeight(MainActivity.this);
			}
		});
	}

	private void getStatusBarHeight(Context context){
		int statusBarHeight=0;
		try {
			Class clazz=Class.forName("com.android.internal.R$dimen");
			Object object=clazz.newInstance();
			Field field=clazz.getField("status_bar_height");
			//反射出该对象中status_bar_height字段所对应的在R文件的id值
			//该id值由系统工具自动生成,文档描述如下:
			//The desired resource identifier, as generated by the aapt tool.
			int id = Integer.parseInt(field.get(object).toString());
			System.out.println("id="+id);
			//依据id值获取到状态栏的高度,单位为像素
			statusBarHeight = context.getResources().getDimensionPixelSize(id);
			System.out.println("statusBarHeight="+statusBarHeight+"pixel");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

 

main.xml如下:

<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"
    >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dip"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="利用反射获取状态栏StatusBar的高度"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

 

时间: 2024-10-28 16:03:34

Android利用反射获取状态栏(StatusBar)高度的相关文章

Android有效获取状态栏(StatusBar)高度的方法_Android

本文实例讲述了Android有效获取状态栏(StatusBar)高度的方法.分享给大家供大家参考,具体如下: 碰到了需要获取状态栏高度的问题. 就像android后期版本,无法直接退出一样.找了一些方法来获取状态栏高度,结果都是为0. 还好,牛人是很多的,当时,找到一段代码,能够有效的获取状态栏的高度.特此记录,备忘,以及供大家参考使用: Class<?> c = null; Object obj = null; Field field = null; int x = 0, sbar = 0;

利用反射获取方法参数对象的泛型定义

问题描述 利用反射获取方法参数对象的泛型定义 public CommonRsp<AAARsp> hotelCheckAvailability(CommonReq<BBBReq> req) throws Exception; 如何通过反射获取如上方法中的参数泛型定义BBBReq? 解决方案 你这是java语法吗,如果是的话,其实java的泛型本质上是糖衣语法,编译后泛型是会被擦除的.你获取泛型本质上是没有意义的,应该是获取不到的.

Android OnCreate()中获取控件高度与宽度两种方法详解_Android

Android OnCreate()中获取控件高度与宽度 试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.Me

Android OnCreate()中获取控件高度与宽度两种方法详解

Android OnCreate()中获取控件高度与宽度 试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.Me

Android利用Glide获取图片真正的宽高的实例

前言 有时候需要获取网络图片的宽高来设置图片显示的大小,很多人会直接利用Glide的加载监听去拿图片的宽高,但是这样拿到的不是图片真正的宽高,而是图片显示在ImageView后的宽高.如下: //获取图片显示在ImageView后的宽高 Glide.with(this) .load(imgUrl) .asBitmap()//强制Glide返回一个Bitmap对象 .listener(new RequestListener<String, Bitmap>() { @Override public

利用反射获取静态变量值的问题.

问题描述 publicclassSVC(){publicstaticintcount=0;}privatevoidtest118(objectobj,stringname){while(true){Thread.Sleep(1);Console.WriteLine(obj.GetType().GetFields().FirstOrDefault(f=>f.Name==name).GetValue(obj));}}privatevoidbuttonLogin_Click(objectsender,

android 禁用屏蔽系统状态栏(statusbar)

Object service = getSystemService ("statusbar"); try { Class <?> statusBarManager = Class.forName ("android.app.StatusBarManager"); Method expand = statusBarManager.getMethod ("disable",int.class); //getMethod("col

利用反射获取类或者方法或者字段上的注解的值

从JDK1.5之后,注解在各大框架上得到了广泛的应用.下面这个例子中,你可以判断一个类或者方法或者字段上有没有注解,以及怎么获取上面的注解值.话不多说,代码如下: AnnotationTest01.java package com.zkn.newlearn.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.R

android获取状态栏高度

公司项目中使用了popWindow,并且需求指明了popWindow必须是和Activity类似的全屏模式,并且从页面底部弹出! 当popWindow所有设计完毕后,从底部弹出popWindow,发现设置在popWindow的上的titlebar一部分被压入状态栏的底部了,也就是说全屏是全屏了,但是超过了应有的部分! 解决方案: 为了达到良好的兼容性,我们可以如下变现代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /**  *