3

我有一个 imageview - 它具有两个属性 - focusablefocusableintouchmode设置为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 上,第二次单击执行操作。我不确定为什么会这样。
第一次单击应该请求焦点并执行操作。
任何有关如何做到这一点的帮助将不胜感激。

4

1 回答 1

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.OnTouchListenerImageView.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

于 2013-02-12T13:15:00.520 回答