ViewTreeObserver示例(二)

来源:互联网 发布:android程序员面试题 编辑:程序博客网 时间:2024/06/06 05:43

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;@Overrideprotected 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() {@Overridepublic void onTouchModeChanged(boolean isInTouchMode) {if (isInTouchMode) {mTouchModeChangeTextView.setText("In touch mode");}else{mTouchModeChangeTextView.setText("Not in touch mode");}}});    //当在一个视图树中全局布局发生改变    //或者视图树中的某个视图的可视状态发生改变时调用该方法    mViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {if (isClick) {if (mSecondEditText.isShown()) {mFirstEditText.setText("监听到第二个TextView被显示");} else {mFirstEditText.setText("监听到第二个TextView被隐藏");}}}});    //当一个视图树将要绘制时,调用该方法    //此处当mFirstEditText将要绘制时给其设置了hint和字体大小    //注意:必须返回true,否则整个界面不能完整显示    mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {@Overridepublic boolean onPreDraw() {mFirstEditText.setHint("调用了OnPreDrawListener");mFirstEditText.setTextSize((float)15.0);return true;}});    //当在一个视图树中的焦点状态发生改变时,调用该方法    mViewTreeObserver.addOnGlobalFocusChangeListener(new OnGlobalFocusChangeListener() {@Overridepublic 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{@Overridepublic void onClick(View v) {mLinearLayout.setClickable(false);isClick=true;if (mSecondEditText.isShown()) {mSecondEditText.setVisibility(View.GONE);} else {mSecondEditText.setVisibility(View.VISIBLE);}}    }}


 

原创粉丝点击