jolfe的安卓之旅_04ImageButton.setOnFocusChangeListener

来源:互联网 发布:cad怎么添加网络打印机 编辑:程序博客网 时间:2024/05/01 23:19

前两天imagebutton的焦点监听事件没办法触发,十分的郁闷,跟人感觉Google SDK这本书在这里的这个例子做的不好 容易让人迷惑,网上看了很多人,也只是抄了代码,没有具体说明原理性的东西,反正我是郁闷了两天,加上昨天刷机用了一天,所以今天回头重新理解了一下,现在将自己总体的理解写到这里,希望大家能互相学习。

具体的情况是ImageButton.setOnFocusChangeListener(new MyLitener());在设置后看不到触发的效果,我在对应的监听事件里加了Log也一直没有打印出来,所有就有点晕乎了,最后花了今天早上的时间,总算理解过来怎么回事了,好吧,又废话了,下面说明原因:

先把ImageButton的点击事件注释掉,完全觉得没必要,会影响你的判断,因为即使失去焦点还是会触发的。

我利用另一个button通过ImageButton.setFocusable((true or false);myImageButton.setFocusableInTouchMode(true or false);来控制ImageButton获取焦点的可行性,原因会在后面说明。

1、当我刚进应用,点击imagebutton的时候setOnFocusChangeListener()没有被触发(调试数据发现Focus为false),

2、即使设置了myImageButton.setFocusable(true);myImageButton.setFocusableInTouchMode(true);打印的结果依旧Focus仍然为false,但是当我再点击imagebutton时候可以触发一次MyLitener,(焦点监听事件被触发,imagebutton对应的内容被修改了。。。),

3、可是当我再点击一次button的时候,不用再点击imagebutton,imagebutton的对应内容直接被修改了。这下子我有点恍然大悟的感觉。

并且去查了myImageButton.setFocusable(true);myImageButton.setFocusableInTouchMode(true)这两个方法的作用,现总结完这些,下面会讲解一下

小总结:

ImageButton.setFocusable((true or false);myImageButton.setFocusableInTouchMode(true or false);都为true的时候代表的是,你对应设置的这个空间可以获取焦点了(而不是获取焦点,注意是  可以获取,不是已经获取)这意味着你必须点击ImageButton才能真正的改变Focus的值,也就是触发了一次焦点监听事件。

当imagebutton处于已经获取焦点的状态也就是Focus,再次修改ImageButton.setFocusable((true or false);myImageButton.setFocusableInTouchMode(true or false);的值为false的时候,会立刻触发焦点监听事件,这只是google的一种设计,你千万别问我这个是为什么,我只能说合乎情理,都不要焦点了还要再点击一次才能失去焦点有什么意义呢。

以上就是我对焦点监听事件的总结,本来以为很简单,却被晕倒里面,所以彻底的了解下,之后会贴出测试代码。

补充:如果直接在xml文件里面设置这两个属性为true,在打开应用的时候,会直接修改Focus为true,并触发一次监听事件,郁闷干嘛不在代码里面也直接做成直接修改焦点(再次提醒,代码里面设置了代表下次点击对应空间是可获取)

获取焦点的表现就是你点击的按钮的背景色一直都在不会消失。

好了 现在说明下上面要说的myImageButton.setFocusable(true);myImageButton.setFocusableInTouchMode(true)这两个方法的作用;

分三种情况(代码中测试)

1、setFocusable()   设置是否可以指向(不太理解这句话),总是这里修改了才能在你点击imagebutton的时候Focus的值才会改变,如果不设置,你懂的,焦点监听是不可能被触发的,因为Focus的不会改变。可以理解为预先设置下次点击之后要修改的Focus的值,等待点击之后修改为setFocusable所设置的值

2、setFocusableInTouchMode()  设置Focus改变的方式,如果设置为true,默认为手指点击时候改变。其他的没研究过,知道的给我讲讲,求讲解。


下面把代码贴出来

代码

package google.sdk.test_04_02;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;


public class MainActivity extends Activity {
private ImageButton myImageButton;
private Button myButton;
private TextView myTextView;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


// 创建三个组件
myImageButton = (ImageButton) findViewById(R.id.myImageButton1);
myButton = (Button) findViewById(R.id.myButton1);
myTextView = (TextView) findViewById(R.id.myTextView1);


// 通过OnFocusChangeListener来响应ImageButton的onFocus事件
myImageButton.setOnFocusChangeListener(new MyOnFocusChangeListener());


// 通过onClickListener来响应ImageButton的onClick事件
// myImageButton.setOnClickListener(new OnClickListener() {
// public void onClick(View v) {
// if (myTextView.getText().toString().trim()
// .equals("图片按钮状态为: Got Click.iconfull")) {
// // 如果ImageButton状态为onClick则改变ImageButton的图片和说明
// myTextView.setText("图片按钮状态为: Got Click.iconempty");
// myImageButton.setImageResource(R.drawable.iconempty);
// } else {
// // 如果ImageButton状态为onClick则改变ImageButton的图片和说明
// myTextView.setText("图片按钮状态为: Got Click.iconfull");
// myImageButton.setImageResource(R.drawable.iconfull);
// }
//
// }
// });


// 通过onClickListener来响应Button的onClick事件
myButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {


// // 如果Button状态为onClick改变ImageButton图片
// myTextView.setText("图片按钮状态为:Lost Focus");
// myImageButton.setImageResource(R.drawable.iconempty);
if (myImageButton.hasFocus()) {
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus()
+ "1");
myImageButton.setFocusableInTouchMode(false);
myImageButton.setFocusable(false);
// myTextView.setText("失去焦点");
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus()
+ "2");
} else if (!myImageButton.hasFocus()) {
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus()
+ "3");
myTextView.setText("获取了焦点");
myImageButton.setFocusable(true);
myImageButton.setFocusableInTouchMode(isChild());
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus()
+ "4");
}
}
});
}


class MyOnFocusChangeListener implements OnFocusChangeListener {


@Override
public void onFocusChange(View v, boolean hasFocus) {

if (hasFocus == true) {
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus() + "5");
// 更改状态说明
myTextView.setText("图片按钮状态为:Got Focus");
// 更改按钮背景图片
myImageButton.setImageResource(R.drawable.iconfull);
} else if (!hasFocus) {
Log.i("myImageButton.hasFocus()", myImageButton.hasFocus() + "6");
myTextView.setText("图片按钮状态为: Lost Focus");
myImageButton.setImageResource(R.drawable.iconempty);
}


}


}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/white"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/myTextView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/str_textview1"
        android:textColor="@drawable/blue" />


    <ImageButton
        android:id="@+id/myImageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/iconempty" />


    <Button
        android:id="@+id/myButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/str_button1" />


</LinearLayout>


转载地址:http://blog.csdn.net/jolfe/article/details/9145651

原创粉丝点击