Android On Focus Listener和On Click Listener on ImageView

时间:2013-02-12 12:44:52

标签: android onclicklistener onfocus

我有一个imageview - 它有两个属性 - 可聚焦 focusableintouchmode 设置为 true

<ImageView
        android:id="@+id/ivMenu01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:focusable="true"
        android:focusableInTouchMode="true" >
    </ImageView>

我在我的活动中实施了 onFocusChangeListener -


 @Override
public void onFocusChange(View v, boolean hasFocus) {
    switch (v.getId()) {
    case R.id.ivMenu01:

            if (hasFocus) {
                ivMenu01.setImageBitmap(Utility
                        .getBitmap("Home_ford_focus.png")); // Focussed image
            } else {
                ivMenu01.setImageBitmap(Utility.getBitmap("Home_ford.png")); // Normal image
            }

        break;

    default:
        break;
    }

}

onClickListener -

 case R.id.ivMenu01:
                ivMenu01.requestFocus();
                Intent iFord = new Intent(HomeScreen.this, FordHome.class);
                startActivity(iFord);

break;

现在,当我单击ImageView时,第一次单击将焦点提供给ImageView,第二次单击执行操作。 我不确定为什么会这样。
第一次点击应该请求焦点并执行操作 任何有关如何做到这一点的帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:7)

这是小部件框架的设计方式。

当您查看View.onTouchEvent()代码时,您会发现只有在视图重点突出时才会执行点击操作:

    // take focus if we don't have it already and we should in
    // touch mode.
    boolean focusTaken = false;
    if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
        focusTaken = requestFocus();
    }

    if (!mHasPerformedLongPress) {
        // This is a tap, so remove the longpress check
        removeLongPressCallback();

        // Only perform take click actions if we were in the pressed state
        if (!focusTaken) {
            // click
        }
    }

因此,正如您所注意到的,第一次点击使视图获得焦点。第二个将触发点击处理程序,因为视图已经具有焦点。

如果要在按下时更改ImageView的位图,则应实施View.OnTouchListener并通过ImageView.setOnTouchListener()方法进行设置。听众应该或多或少看起来像这样:

private View.OnTouchListener imageTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // pointer goes down
            ivMenu01.setImageBitmap(Utility.getBitmap("Home_ford_focus.png"));
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            // pointer goes up
            ivMenu01.setImageBitmap(Utility.getBitmap("Home_ford.png"));
        }
        // also let the framework process the event
        return false;
    }
};

您还可以使用Selector aka State List Drawable来实现相同的功能。请参阅此处的参考:http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList