0

私はこれを理解するのに苦労しています。私は8つのボタンのグリッドビューを持っています。現時点では、onItemClickListener を使用してボタン アクションをトリガーしていますが、これにより 2 つの問題が発生します。

1) ボタンのアクションは、ボタンが押された後に発生します。

2) 2 つのボタンを同時に押すことはできません。最初のボタンを離す必要があります。

私が学んだように、onTouchListener は私の最初の問題を解決するはずですが、どのボタンが押されたかを判断する方法はわかりません。onItemClickListener の私のコードは次のとおりです

gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        Toast.makeText(Activity.this, "" + position, Toast.LENGTH_SHORT).show();

  }
        });

これで、どのボタンが押されたかが正確にわかりました。onTouchListener として実装するためのコードは次のとおりだと思います

        gridview.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            return false;
        }
    }) {

MotionEvent を使用してどのボタンが押されたかを判断するにはどうすればよいですか? 「位置」を渡す前に、これはかなり簡単になりました。また、2 つ以上のボタンが同時に押された場合や別のボタンを放さずに押された場合も考慮に入れる必要があります。

これを達成する方法を知っている人はいますか?

4

3 に答える 3

1

最近この問題にぶつかり、助けを求めてこの投稿に出くわしたので、私が行ったことから、うまくいったように見える2つのことを追加したいと思いました。

1) アクティビティやグリッドビューではなく、アダプターのオブジェクトに onTouchListener を追加しました。

2) OnTouchListener で、MotionEvent.ACTION_DOWN (最初の指のタッチ) と MotionEvent.ACTION_POINTER_DOWN (その後の指のタッチ) を探しました。このようにして、マルチタッチを取得し、ユーザーが指を離すのを待たずにすぐに処理できます。

ImageAdapter と呼んだことに注意してください。それぞれに TextView を追加したので、画像の TextView 背景を使用できますが、非表示のテキストを TextView に追加して、Talkback で動作するようにします)。

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return numCols * numRows;
    }

    public Object getItem(int position) {
        return this;
    }

    public long getItemId(int position) {
        return position;
    }

    // create a new TextView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView;

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            textView = new TextView(mContext);

        } else {
            textView = (TextView) convertView;
        }

        // place any other initial setup needed for the TextView here

        // here's our onTouchListener
        textView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                boolean returnValue;
                int thePosition = v.getId();

                // MotionEvent.ACTION_DOWN gets the first touch
                // MotionEvent.ACTION_POINTER_DOWN gets any subsequent touches (if you place a second finger on the screen)
                // Between these I can get touches as soon as they happen, including multitouch support, without needing to wait until the user lifts their finger.

                if ((event.getAction() == MotionEvent.ACTION_DOWN) || (event.getAction() == MotionEvent.ACTION_POINTER_DOWN)) {
                    TextView textView;
                    if (v == null) {  // if it's not recycled, initialize some attributes
                        textView = new TextView(mContext);

                    } else {
                        textView = (TextView) v;
                    }

                    // Do any processing based on the touch - I call a function and pass the position (number of cell, 1..n) and textview so can make changes to it as needed
                    ScreenTapped(thePosition, textView);
                    // I used a returnValue
                    returnValue = true;
                } else returnValue = false;

                return returnValue;

        });
        return textView;

    } // getView
} //imageadapter
于 2015-02-03T22:29:46.653 に答える
0

私は事実、同じことを理解しようとしています。次のコードを使用して、どのグリッドセルがクリックされたかを突き止めました

public boolean onTouch(View v, MotionEvent me) {

            float currentXPosition = me.getX();
            float currentYPosition = me.getY();
            int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);

Position は gridView の番号を示し、次のようにその特定のアイテムを取得できると思われます

gridView.getItemAtPosition(position)

しかし、それは私が立ち往生しているところです。私の gridView には Textview 項目があり、項目を textview に変換してから操作を実行するのに問題があります。

お役に立てれば!

于 2012-12-10T21:59:37.917 に答える
0

gridView を使用する場合の哲学は次のとおりです。

  • グリッド ビューは onTouchLister を実装します
  • タッチが発生すると、 onTouchLister はすべての ACTION_MOVE イベントの座標を収集します (たくさん:))
  • タッチ イベントが MOVE_UP の場合、座標の下の実際の位置を計算し、グリッド内のアイテムを返します

したがって、解決策は次のようになります。

findViewById(some_grid_view)があるアクティビティで

//Register handler for the onTouch event of gridView in your activity
gridView.setOnTouchListener(new MyActivityOnTouchListener(this));

:私のonTouchリスナーは、アクティビティ内ではなく別のクラス(MyActivityOnTouchListener)に実装されています

...次に、MyActivityOnTouchListener クラスでonTouchメソッドを実装します。

public class CalendarActivityOnTouchListener implements View.OnTouchListener {
    private MyActivity myActivityContext; 
    private GridView mGridView;
    private HashSet<Point> movementCoordinates = new HashSet<Point>;

    //Constructor
    public MyActivityOnTouchListener (MyActivity context){
        this.myActivityContext= context;
        mGridView= myActivityContext.getGridView();  //assign touched gridView into a local variable
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

    /*
     *   NOTE: 
     *    ACTION_MOVE fires events until you release it
     *    ACTION_UP once you release it fires it   
     */

    //while touching the grid a bunch of ACTION_MOVE events are dispatched
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
       //gather all coordinates touched (in a set to avoid duplicates)
       movementCoordinates.add(new Point((int)event.getX(), (int)event.getY()));
       return true;
    }

    //Finally the finger is lifted   
    if (event.getAction() == MotionEvent.ACTION_UP) {

         //convert all movementCoordinates gathered in the previous block into real grid positions
        int position;
        for(Point p : movementCoordinates){
            Log.d("Luka", p.x +" / "+p.y);
            position = calendarGridView.pointToPosition(p.x, p.y);

            //...Do whatever with the position
        }
    }
  }

}

pointToPosition()メソッドは、座標の後ろの位置ではなく -1 を返す場合があるため、注意してください。たとえば、グリッド内のアイテム間にマージンがある場合、それらの座標は位置を返すことができないため、-1

それが役に立てば幸い...

于 2013-05-28T10:51:10.380 に答える