Android开发动态获取控件宽高

最近做项目自定义控件时候想获取控件中元素参数,但各种失败,网上搜了下,自己也总结一下。package com.example.androidtest_02;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewTreeObserver;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.WindowManager.LayoutParams;import android.widget.Button;import android.widget.TextView;/** * * 这个activity测试 : 1.Activity的生命周期 2.程序动态获取控件的宽高 * * 结论:activity启动时候:onCreate()–>onStart()—>onResum()–>onAttachedToWindow()–> * onWindowFocusChanged() * * 当另外一个activity be in front of * 的时候:onPause()—>onWindowFocusChanged()–>onStop() * * 当第一个activity恢复到最前面时候:onRestart()—>onStart()—>onResum()—> * onWindowFocusChanged() * * 当activityfinish的时候:onPause()–>onWindowFocusChanged()–>onStop()–>onDestroy( * ) * * * onAttachedToWindow()此时打印出了控件宽高,其他地方的打印为0 ,so,activity全面加载完了之后才会获取到控件的宽高, * 当我们需要获取控件的宽高时,需要等activity加载完。 * * 第二种与第三种方式:即使实在oncreate()方法里面声明了,回调里面的内容也只能在onResume()方法被调用后才能得到执行。 */public class MainActivity extends Activity implements OnClickListener {public void printLog(String s) {Log.e("——————————-", s);}Button btn1;Button btn2;TextView textview1;/** * 第一种获取宽高的方式。 */int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(this);btn2 = (Button) findViewById(R.id.btn2);textview1 = (TextView) findViewById(R.id.textview1);textview1.measure(w, h);// int height =textview1.getMeasuredHeight();// int width =textview1.getMeasuredWidth();printLog("直接获取宽高:width:" + textview1.getWidth() + "—->height:"+ textview1.getHeight());printLog("使用mesure()获取宽高:width:" + textview1.getWidth()+ "—->height:" + textview1.getHeight());// 即使实在oncreate()方法里面声明了,回调里面的内容也只能在onResume()方法被调用后才能得到执行。// 第二种获取宽高的方式ViewTreeObserver viewTreeObserver = textview1.getViewTreeObserver();viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {printLog("使用ViewTreeObserver 获取宽高:width:"+ textview1.getMeasuredWidth() + "—->height:"+ textview1.getMeasuredHeight());return true;}});// 第三种获取宽高的方式ViewTreeObserver vtb1 = textview1.getViewTreeObserver();vtb1.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {textview1.getViewTreeObserver().addOnGlobalLayoutListener(this);printLog("使用OnGlobalLayoutListener 获取宽高:width:"+ textview1.getWidth() + "—->height:"+ textview1.getHeight());}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_main, menu);return true;}@Overrideprotected void onStart() {super.onStart();printLog("onstart()");printLog("width:" + textview1.getWidth() + "—->height:"+ textview1.getHeight());}@Overrideprotected void onResume() {super.onResume();printLog("onResume()");printLog("width:" + textview1.getWidth() + "—->height:"+ textview1.getHeight());}@Overridepublic void onAttachedToWindow() {super.onAttachedToWindow();printLog("onAttachedToWindow()");printLog("width:" + textview1.getWidth() + "—->height:"+ textview1.getHeight());}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);printLog("onWindowFocusChanged()");printLog("width:" + textview1.getWidth() + "—->height:"+ textview1.getHeight());// 此时打印出了控件宽高,其他地方的打印为0}@Overrideprotected void onRestart() {super.onRestart();printLog("onRestart()");}@Overridepublic void onWindowAttributesChanged(LayoutParams params) {super.onWindowAttributesChanged(params);printLog("onWindowAttributesChanged()");}@Overrideprotected void onPause() {super.onPause();printLog("onPause()");}@Overrideprotected void onStop() {super.onStop();printLog("onStop()");}@Overrideprotected void onDestroy() {super.onDestroy();printLog("onDestroy()");}@Overridepublic void onClick(View v) {if (v.equals(btn1)) {printLog("+++++++++++++++++++马上要跳转了++++++++++++++++++");Intent intent = new Intent(MainActivity.this, Activity1.class);startActivity(intent);} else if (v.equals(btn2)) {printLog("+++++++++++++++++++马上finish了++++++++++++++++++");this.finish();}}@Overridepublic void onBackPressed() {printLog("+++++++++++++++++++我点了返回键,马上要跳转了++++++++++++++++++");}}辽远或偏僻的地方,而会常常想起这一次的旅行,想起那座山,那个城,那些人……

Android开发动态获取控件宽高

相关文章:

你感兴趣的文章:

标签云: