Различайте setOnClickListener и setOnTouchListener - PullRequest
4 голосов
/ 02 ноября 2011

Мне нужна помощь. В моем приложении для Android у меня есть ViewFlipper, который содержит некоторые LinearLayout. На каждом LinearLayout у меня есть ImageView. Для переключения между экранами я использую этот код:

LinearLayout layMain = (LinearLayout) findViewById(R.id.layout_main);
        layMain.setOnTouchListener((OnTouchListener) this);

// --------------

public boolean onTouch(View arg0, MotionEvent arg1) {

        // Get the action that was done on this touch event
        switch (arg1.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            // store the X value when the user's finger was pressed down
            downXValue = arg1.getX();
            break;
        }

        case MotionEvent.ACTION_UP: {
            // Get the X value when the user released his/her finger
            float currentX = arg1.getX();

            // going backwards: pushing stuff to the right
            if (downXValue < currentX) {
                // Get a reference to the ViewFlipper
                ViewFlipper vf = (ViewFlipper) findViewById(R.id.details);
                // Set the animation
                vf.setOutAnimation(AnimationUtils.loadAnimation(this,
                        R.anim.push_right_out));
                vf.setInAnimation(AnimationUtils.loadAnimation(this,
                        R.anim.push_right_in));

                // Flip!
                vf.showPrevious();
            }

            // going forwards: pushing stuff to the left
            if (downXValue > currentX) {
                // Get a reference to the ViewFlipper
                ViewFlipper vf = (ViewFlipper) findViewById(R.id.details);
                // Set the animation
                // vf.setInAnimation(AnimationUtils.loadAnimation(this,
                // R.anim.push_left_in));
                vf.setOutAnimation(AnimationUtils.loadAnimation(this,
                        R.anim.push_left_out));
                vf.setInAnimation(AnimationUtils.loadAnimation(this,
                        R.anim.push_left_in));
                // Flip!
                vf.showNext();
            }
            break;
        }
        }

        // if you return false, these actions will not be recorded
        return true;
    }

Каждый экран содержит ImageView. Поэтому, когда я переключаю экраны, изображение меняется. Теперь я хочу реализовать это: при нажатии на изображение открывается URL-адрес. Вот мой код:

ViewFlipper vf = (ViewFlipper) findViewById(R.id.details);

        for (i = 0; i < jArray.length(); i++) {
            LinearLayout l = new LinearLayout(this);
            l.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                    LayoutParams.FILL_PARENT));
            l.setBackgroundColor(0x000000);
            l.setOrientation(LinearLayout.VERTICAL);
            vf.addView(l);

            ImageView img = new ImageView(this);
            img.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                    LayoutParams.FILL_PARENT));
            Drawable image1 = ImageOperations(getBaseContext(), url[i]);
            img.setImageDrawable(image1);
            System.out.println("target" + target[i]);
            img.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri
                            .parse("http://google.com"));
                    startActivity(browserIntent);
                }
            });

            l.addView(img);
        }

Проблема в том, что каждый раз, когда я касаюсь экрана, URL-адрес открыт, и теперь я не могу переключаться между экранами. Как это сделать, чтобы отличить onClick () от Touch ()?

Пожалуйста, помогите мне .. Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Я думаю, что вы используете image View как фон для Linear Layout, кажется, что Activity обрабатывает прикосновения для ImageView, чтобы достичь вашего прослушивателя Functionality setTouch для imageView, и мы можем косвенно обрабатывать щелчок для просмотра изображений, используя следующий код в OntouchListener,

if (downXValue == currentX) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri
                        .parse("http://google.com"));
                startActivity(browserIntent);}
0 голосов
/ 02 ноября 2011

Я понял вашу проблему, но дело в том, что для переключения экранов, которые вы должны использовать, Viewflipper onTouchlistener вроде:

 mFlipper.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
                     //// your touch code

вместо Linearlayout touch listeners.

тогда вы можете использовать normal touch listeners for your Imageview events

Надеюсь, это поможет.

...