最近,在创建项目自定义控件时,尝试获取控件的元素参数,但出现了各种失败。 我在网上搜索了一下,我自己也会试着总结一下。
package com.example.Android test _ 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.onclick listener;
import Android.view.viewtreeobserver;
import Android.view.viewtreeobserver.ongloballayoutlistener;
import Android.view.window manager.layout params;
import android.widget.Button;
import android.widget.TextView;
//*
*
*该activity测试:1.Activity的生命周期2 .程序动态获取控件的宽度和高度
*
*结论: activity启动时: oncreate---onstart---onresum---onattachedtowindow---- onattachedtowindow
* onWindowFocusChanged (
*
*另一个activity be in front of
*时间: on pause---onwindowfocuschanged---onstop ()
*
*当第一个activity回到开头时: on restart---- onstart---onresum-- -
* onWindowFocusChanged (
*
对于activity finish:on pause---- onwindowfocuschanged---onstop---on destroy (
* )
*
*
* onAttachedToWindow ()此时打印控件的宽度和高度,其他地方的打印在全面加载0、so、activity后获取控件的宽度和高度。
*如果需要获取控件的宽度和高度,则必须等待activity加载。
*
*第二种和第三种方法:只有在调用oncreate (即使在方法中声明,回调中的内容也是onResume )方法之后才能执行。
*/
publicclassmainactivityextendsactivityimplementsonclicklistener {
公共语音打印日志(strings ) {
log.e------------,s;
}
Button btn1;
Button btn2;
TextView textview1;
//*
*获取宽度和高度的第一种方法。
*/
intw=view.measurespec.makemeasurespec (0,View.MeasureSpec.UNSPECIFIED );
inth=view.measurespec.makemeasurespec (0,View.MeasureSpec.UNSPECIFIED );
@Override
保护性视频创建(bundlesavedinstancestate )。
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("+++++++++++++++++++我点了返回键,马上要跳转了++++++++++++++++++");
}
}