2

Android のドラッグ アンド ドロップ グリッドのビューに onClick ハイライトを追加する作業を行っています。プロジェクトはGitHubにあります(dev ブランチには、セレクターを使用しているコードが含まれています)。

私が抱えている問題は、onClick セレクターをビューの背景として設定したときのアダプターにあります。ビューをクリックすると、そのビューだけの背景を変更するのではなく、セレクターがすべてのビューの背景を変更します。

これは、ViewGroup (以下) の onTouch でクリックがどのように処理されているかの結果であると確信しています。すべてのビューが強調表示されないようにするために、true/false を別の方法で返す必要があるのか​​ 、それとも onClick リスナーを別の方法でトリガーする必要があるのか​​ わかりません。

アイデア/ヘルプをいただければ幸いです。

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        touchDown(event);
        break;
    case MotionEvent.ACTION_MOVE:
        touchMove(event);
        break;
    case MotionEvent.ACTION_UP:
        touchUp(event);
        break;
    }
    if (aViewIsDragged())
        return true;
    return false;
}

private void touchUp(MotionEvent event) {
    if(dragged == -1) {
        if(onClickListener != null) {
            View clickedView = getChildAt(getTargetAtCoor((int) event.getX(), (int) event.getY()));
            if(clickedView != null)
                onClickListener.onClick(clickedView);
        }
    } else {
        manageChildrenReordering();
        hideDeleteView();
        cancelEdgeTimer();

        movingView = false;
        dragged = -1;
        lastTarget = -1;
        container.enableScroll();
        cancelAnimations();
    }
}

編集: ViewGroup ドキュメントandroid:addStatesFromChildrenを見た後、私が探しているもののように聞こえますが、効果がないようです。

android:addStatesFromChildren

この ViewGroup の描画可能な状態に、その子の描画可能な状態も含めるかどうかを設定します。これは、たとえば、子の EditText またはボタンがフォーカスされているときにグループがフォーカスされているように見せるために使用されます。

「true」または「false」のいずれかのブール値である必要があります。

これは、この型の値を含むリソース ("@[package:]type:name" の形式) またはテーマ属性 ("?[package:][type:]name" の形式) への参照である場合もあります。 .

これは、グローバル属性リソース シンボル addStatesFromChildren に対応します。

アップデート

これを解決する方法を見つけました。プルリクエストはこちら

4

1 に答える 1

2

編集

layout.setClickable(true);ビュー関数 (133 行目と 156 行目の間) に追加して、各項目をクリック可能にします。これは、独自の選択可能な状態を持つために必要です。それがなければ、グリッドはタッチを受け取り、その状態が各子に渡されます。これにより onTouch の機能が損なわれますが、それは別の質問になります。

onTouch の機能を変更することを心配したくない場合は、セレクターを使用する代わりに、さまざまなタッチ機能で選択した項目の背景を手動で変更できます。


ポイントを逃したオリジナル:

多分私は何かが欠けているかもしれませんが、onTouch から View "v" を渡して、それが場所に基づいてどのビューであるかを把握しようとする代わりに、それを clickedView として使用できると思います。

于 2012-12-19T16:51:24.113 に答える