ViewTreeObserver示例(二)

main.xml如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
   >

    <TextView
        android:id="@+id/touchModeChangeTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:layout_marginTop="30dip"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="25sp"
        />

    <EditText
        android:id="@+id/firstEditText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dip"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="25sp"
        />

    <EditText
        android:id="@+id/secondEditText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dip"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="25sp"
        />
    <TextView
        android:id="@+id/globalFocusChangeTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="显示焦点的变化"
        android:layout_marginTop="30dip"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="15sp"
      />

    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dip"
        android:gravity="center"
        android:text="切换第二个EditText的显示和隐藏"
        android:textColor="@android:color/black"
        android:textSize="15sp"
      />

</LinearLayout>

 

MainActivity如下:

package cn.com.testviewtreeobserver2;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.ViewTreeObserver.OnTouchModeChangeListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
/**
 * Demo描述:
 * ViewTreeObserver的测试
 * 备注说明:
 * OnTouchModeChangeListener的相关
 * 测试未实现
 * 重要参考:
 * http://blog.csdn.net/pathuang68/article/details/6431035
 * Thank you
 *
 */
public class MainActivity extends Activity {
	private View mLinearLayout;
	private TextView mTouchModeChangeTextView;
	private EditText mFirstEditText;
	private EditText mSecondEditText;
	private TextView mGlobalFocusChangeTextView;
	private Button mButton;
	private ViewTreeObserver mViewTreeObserver;
	private boolean isClick=false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
    private void init(){
    	mLinearLayout=findViewById(R.id.LinearLayout);
    	mTouchModeChangeTextView=(TextView) findViewById(R.id.touchModeChangeTextView);
    	mFirstEditText=(EditText) findViewById(R.id.firstEditText);
    	mSecondEditText=(EditText) findViewById(R.id.secondEditText);
    	mGlobalFocusChangeTextView=(TextView) findViewById(R.id.globalFocusChangeTextView);
    	mButton=(Button) findViewById(R.id.button);
    	mButton.setOnClickListener(new ButtonOnClickListenerImpl());
    	mViewTreeObserver=mLinearLayout.getViewTreeObserver();
    	viewTreeObserverAddListeners();
    }
    //为ViewTreeObserver设置各种监听
    private void viewTreeObserverAddListeners(){
    	//当一个视图树的触摸模式发生改变时,调用该方法
    	//在该实例中未实现对于该方法的相关测试
    	mViewTreeObserver.addOnTouchModeChangeListener(new OnTouchModeChangeListener() {
			@Override
			public void onTouchModeChanged(boolean isInTouchMode) {
				if (isInTouchMode) {
					mTouchModeChangeTextView.setText("In touch mode");
				}else{
					mTouchModeChangeTextView.setText("Not in touch mode");
				}
			}
		});
    	//当在一个视图树中全局布局发生改变
    	//或者视图树中的某个视图的可视状态发生改变时调用该方法
    	mViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				if (isClick) {
					if (mSecondEditText.isShown()) {
						mFirstEditText.setText("监听到第二个TextView被显示");
					} else {
						mFirstEditText.setText("监听到第二个TextView被隐藏");
					}
				}
			}
		});
    	//当一个视图树将要绘制时,调用该方法
    	//此处当mFirstEditText将要绘制时给其设置了hint和字体大小
    	//注意:必须返回true,否则整个界面不能完整显示
    	mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
			@Override
			public boolean onPreDraw() {
				mFirstEditText.setHint("调用了OnPreDrawListener");
				mFirstEditText.setTextSize((float)15.0);
				return true;
			}
		});
    	//当在一个视图树中的焦点状态发生改变时,调用该方法
    	mViewTreeObserver.addOnGlobalFocusChangeListener(new OnGlobalFocusChangeListener() {
			@Override
			public void onGlobalFocusChanged(View oldFocus, View newFocus) {
				if (oldFocus!=null&&newFocus!=null) {
					mGlobalFocusChangeTextView.setText
					("Focus FROM:" + oldFocus.toString()+ " TO:" + newFocus.toString());
				}
			}
		});
    }

    //注意使用View.INVISIBLE不会调用OnGlobalLayoutListener
	//因为View.INVISIBLE只是控件不可见却还占据着位置,此时
	//布局在实质上没有发生变化
    private class ButtonOnClickListenerImpl implements OnClickListener{
		@Override
		public void onClick(View v) {
			mLinearLayout.setClickable(false);
			isClick=true;
			if (mSecondEditText.isShown()) {
				mSecondEditText.setVisibility(View.GONE);
			} else {
				mSecondEditText.setVisibility(View.VISIBLE);
			}
		}
    }
}

 

时间: 2024-09-20 05:33:40

ViewTreeObserver示例(二)的相关文章

WPF命中测试示例(二)——几何区域命中测试

原文:WPF命中测试示例(二)--几何区域命中测试 接续上次的命中测试,这次来做几何区域测试示例.   示例 首先新建一个WPF项目,在主界面中拖入一个按钮控件,并修改代码中的以下高亮位置: 当前设计视图界面如下: 接下来,转到窗体的"Window_Loaded"事件处理函数,编写函数代码: private void Window_Loaded(object sender, RoutedEventArgs e) { Random r = new Random(); for (int i

Asp.net 2.0 制作复合控件示例(二)[示例代码下载]

asp.net|控件|示例|下载 (一). 概述   通过制作一个<计算器>功能自定义复合控件演示复合控件的制作(二). 代码   1. 核心控件实现代码文件ComputeControl.cs  1using System;  2using System.Collections.Generic;  3using System.Text;  4using System.Web;  5using System.Web.UI;  6using System.Web.UI.WebControls; 

CYQ.Data 轻量数据层之路 应用示例二 在线聊天(六)

继上一篇:CYQ.Data 轻量数据层之路 华丽升级 V1.3出世(五),本篇趁周末而且是下班时间看贴人不多,低调让其出手应用一下: 同样为了能一篇介绍完一个示例,我精简挑选了一下,本次的示例为:注册+登陆+在线聊天[省去了私聊部分] 在看此文示例之前,请先看:CYQ.Data 轻量数据层之路 应用示例篇(四) --因为注册+登陆从那直接Copy的,这节就省过了.   当前环境同样是:VS2005+SQL2005,以下进入正题: 一:数据库 起名:Chat 两个表:Users+Message,上

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

ViewTreeObserver示例(一)

main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > &l

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B

ListView中Item布局示例二

第一种方式如下: <?xml version="1.0" encoding="utf-8"?> <!-- 方式一 --> <!-- 需求:在ListView显示时每个Item的上下左右都有一定的空白距离.尤其是在垂直方向的 每个Item保持了一定的距离.所以可以通过对ListView的Item布局设置整体的margin来实现 --> <!-- 错误的解决方式: 在最外层LinearLayout又嵌套了一层LinearLayo

Android中AutoCompleteTextView完整示例(二)

MainActivity如下: package cc.testautocompletetextview2; import android.os.Bundle; import android.app.Activity; /** * Demo描述 * 利用自定义AutoCompleteTextView完成邮箱自动补全功能 * * 参考资料: * 1 http://blog.csdn.net/fx_sky/article/details/9326129 * 2 http://blog.csdn.net

Android清理设备内存详细完整示例(二)

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;