3

私はイメージビューを持っています - それは両方の属性を持っています - focusable と focusableintouchmodetrue設定されています

<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 にフォーカスが移動し、2 回目のクリックでアクションが実行されます。なぜこれが起こっているのかわかりません。
最初のクリックは、アクションを実行するだけでなく、フォーカスを要求する必要があります。
これを行う方法についてのヘルプは非常に高く評価されます。

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
        }
    }

お気づきのように、最初のクリックでビューがフォーカスされます。ビューには既にフォーカスがあるため、2 つ目はクリック ハンドラーをトリガーします。

が押され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 に答える