版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
- 最近做項目自定義控件時候想獲取控件中元素參數,但各種失敗,網上搜了下,自己也總結一下。
- 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);
- @Override
- protected 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() {
- @Override
- public boolean onPreDraw() {
- printLog("使用ViewTreeObserver 獲取寬高:width:"
- + textview1.getMeasuredWidth() + "---->height:"
- + textview1.getMeasuredHeight());
- return true;
- }
- });
- // 第三種獲取寬高的方式
- ViewTreeObserver vtb1 = textview1.getViewTreeObserver();
- vtb1.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- textview1.getViewTreeObserver().addOnGlobalLayoutListener(this);
- printLog("使用OnGlobalLayoutListener 獲取寬高:width:"
- + textview1.getWidth() + "---->height:"
- + textview1.getHeight());
- }
- });
- }
- @Override
- public 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;
- }
- @Override
- protected void onStart() {
- super.onStart();
- printLog("onstart()");
- printLog("width:" + textview1.getWidth() + "---->height:"
- + textview1.getHeight());
- }
- @Override
- protected void onResume() {
- super.onResume();
- printLog("onResume()");
- printLog("width:" + textview1.getWidth() + "---->height:"
- + textview1.getHeight());
- }
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- printLog("onAttachedToWindow()");
- printLog("width:" + textview1.getWidth() + "---->height:"
- + textview1.getHeight());
- }
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- printLog("onWindowFocusChanged()");
- printLog("width:" + textview1.getWidth() + "---->height:"
- + textview1.getHeight());// 此時打印出了控件寬高,其他地方的打印爲0
- }
- @Override
- protected void onRestart() {
- super.onRestart();
- printLog("onRestart()");
- }
- @Override
- public void onWindowAttributesChanged(LayoutParams params) {
- super.onWindowAttributesChanged(params);
- printLog("onWindowAttributesChanged()");
- }
- @Override
- protected void onPause() {
- super.onPause();
- printLog("onPause()");
- }
- @Override
- protected void onStop() {
- super.onStop();
- printLog("onStop()");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- printLog("onDestroy()");
- }
- @Override
- public 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();
- }
- }
- @Override
- public void onBackPressed() {
- printLog("+++++++++++++++++++我點了返回鍵,馬上要跳轉了++++++++++++++++++");
- }
- }