2

内部 (子) カスタム イメージ ビューを保持する線形レイアウトがあります。

私の目標は、画像ビューに背景セレクターを設定し、リスナーを線形レイアウトに設定することです。

ただし、セレクターとリスナーを連携させることはできません。イベントの処理方法がわかりません。

すばやくタップすると機能しますが、ビューを指でドラッグすると、画像ビューは選択された状態のままになります。

これは、線形レイアウトとそのリスナーへの参照を持つアクティビティです。

public class EventDispatchingDemoActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.my_layout);

        linearLayout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v)
            {
                Toast.makeText(getBaseContext(), "Click", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

これがカスタムビューです(どこかで見つけたコードです、作者の功績です)

public class ImageSelector extends ImageView
{

    public ImageSelector(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setBackgroundDrawable(new NavStateListDrawable(getContext(), 0));
        setClickable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        super.onTouchEvent(event);
        return false;
    }

    public class NavStateListDrawable extends StateListDrawable
    {

        private int level;

        public NavStateListDrawable(Context context, int level)
        {

            this.level = level;
            // int stateChecked = android.R.attr.state_checked;
            int stateFocused = android.R.attr.state_focused;
            int statePressed = android.R.attr.state_pressed;
            int stateSelected = android.R.attr.state_selected;

            addState(new int[] { stateSelected }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { statePressed }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { stateFocused }, context.getResources().getDrawable(R.drawable.slide_feedback));
            addState(new int[] { -stateFocused, -statePressed, -stateSelected }, context.getResources().getDrawable(android.R.color.transparent));
        }

        @Override
        protected boolean onStateChange(int[] stateSet)
        {

            boolean nowstate = super.onStateChange(stateSet);

            try
            {
                LayerDrawable defaultDrawable = (LayerDrawable) this.getCurrent();

                LevelListDrawable bar2 = (LevelListDrawable) defaultDrawable.findDrawableByLayerId(R.id.element_contact_image_selector);
                bar2.setLevel(level);
            }
            catch (Exception exception)
            {

            }

            return nowstate;
        }
    }
}

そして、ここにxmlがあります:

    <?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="#acf1fa"
    android:gravity="center"
    android:orientation="vertical" >

    <!-- outer layout -->

    <LinearLayout
        android:id="@+id/my_layout"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#00ff00"
        android:gravity="center" >

        <!-- inner layout -->

        <dor.event.dispathing.ImageSelector
            android:id="@+id/inner_layout"
            android:layout_width="150dp"
            android:layout_height="150dp" />
    </LinearLayout>

</LinearLayout>

ソースをアップロードしました: http://www.filefactory.com/file/5ikfwyk9j5bx/n/EventDispatchingDemo.rar

よろしくお願いします。

4

1 に答える 1

1

申請書を書いていたときに、同様の問題があったことを覚えています。

1)リストビューの行がクリックされた場合にキャプチャしようとしていますか? リストビュー全体ではなく、個々の行のクリックをキャプチャする「listView.setonItemClickListener」が必要だと思います。

2)クリック可能なアイテムが含まれるリストビューがある場合、クリックをキャプチャするという点で、その中のクリック可能なアイテムが優先されると思います。優先する以上に、クリック イベントが親のイベント ハンドラに返されるのをブロックしていると思います。

クリック可能なアイテムのフォーカス可能性をfalseに設定することは、ある程度有効な解決策だと思います。これらのクリック可能なアイテムがフォーカスできなくなると、リストビューの行にフォーカスが戻ります。もう 1 つの解決策は、誰 (行全体または画像) が最初のクラックを取得し、行内でトリガーされたイベントを取得するかを制御する descendantFocusability プロパティを操作することです。必要なものがあると思われる他の質問を次に示します。

リスト内のボタンを使用してListactivityでonListItemClickを起動する方法は?

行にクリック可能な項目がある Android ListView により、スクロールを継続する際に問題が発生する

于 2012-05-01T13:44:29.317 に答える