onTouchListener uyarısı: onTouch, bir tıklama algılandığında View # performClick'i çağırmalıdır


110

Bir onTouchListener. Ne yazık ki onTouch () throwsbana bir uyarı yöntemi :

com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected

Ne anlama geliyor? Bu uyarı hakkında herhangi bir bilgi bulamadım. İşte tam kod:

LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content);

llCalculatorContent.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Tools.hideKeyboard(getActivity(), getView());
        getView().clearFocus();
        return false;
    }   
});

17
sadece uyarıdan kurtulmak istiyorsanız arayın v.performClick(). Uygulama biraz ses çıkarır (cihazınızda etkinleştirdiyseniz) ve muhtemelen geçersiz kılmadığınız onClickListener'ı çağırır
Blackbelt

Cevabınız doğruydu. Teşekkürler
Trzy Gracje

Yanıtlar:


131

Hadi bakalım:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //some code....
        break;
    case MotionEvent.ACTION_UP:
        v.performClick();
        break;
    default:
        break;
    }
    return true;
}

14
yalnızca event == MotionEvent.Action_UP veya bunun gibi bir şey olduğunda çağrılmamalıdır? Ayrıca, "yanlış" döndürmek aslında orijinal tıklama yöntemini çağırmaz, bu nedenle bunun yerine "doğru" döndürmeniz gerekir mi?
android geliştiricisi

@longilong Dilerseniz onu anahtar kutusu kullanacak şekilde de ayarlayabilirsiniz, ancak bu mantıksal olarak aynı ...
android geliştiricisi

3
Benzer bir uyarım var. Ama benim senaryom biraz farklı çünkü RecyclerView'ı kurarken anonim bir OnTouchListener ayarlıyorum (myRecyclerView.setOnTouchListener'ı çağırıyorum. Android Studio tüm anonim sınıfı benzer bir uyarı ile işaretliyor ve v.performClick'i eklesem bile uyarı kalıyor.
fr4gus

8
Bu yöntemden yanlış dönersek, aramamız gerekmemeli performClick, değil mi? Bu durumda tüy
bırakma

9
Uyarıyı düzeltmek için hiçbir şey yapmaz.
TheLibrarian

2

Lint'i bastırabilirsiniz

@SuppressLint("ClickableViewAccessibility")

Sen çağırmalıdır performClick()içeride onTouchEvent().

@Override
public boolean onTouchEvent(MotionEvent event) {
    //A logic 

    performClick();
    return super.onTouchEvent(event);
}

veya

findViewById(R.id.view1).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        v.performClick();

        return v.onTouchEvent(event);
    }
});

OnTouch akış

Daha fazlasını buradan okuyun


1
Geçersiz kılmanıza gerek yok performClick(). Lütfen kodunuzu paylaşın
yoAlex5

1

Custom ViewAçıkça geçersiz kılan bir kullanmıyorsanız onPerformClick, yalnızca Secko'nun cevabını takip ederek uyarı kaldırılmaz.

Cevabına ek olarak, android.widget.Buttonveya gibi sınıflarda aynı Buttonşeyi yapmak için, hedef görünümü genişleten basit bir özel görünüm oluşturmanız gerekir.

Misal :

Özel Görünüm Sınıfı:

public class UselessButton extends AppCompatButton {
    public UselessButton(Context context) {
        super(context);
    }

    public UselessButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public UselessButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean performClick() {
        return super.performClick();
    }
}

XML :

<stackoverflow.onEarth.UselessButton
    android:id="@+id/left"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:background="@drawable/left"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.16"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBaseline_toBaselineOf="@+id/right"
    app:layout_constraintVertical_bias="0.5" />

Java :

    left.setOnTouchListener((v, event) -> {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            enLeft = 1;
            enRight = 0;
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            enLeft = 0;
            v.performClick();
            return false;
        } else {
            return false;
        }
    });

Mevcut sorunlar: Uyarı IDE tarafından çözülür, ancak bu tıklama eyleminin gerçek bir Android Cihazda pratik olarak gerçekleştirildiğini göremez.

DÜZENLEME : Tıklama olayını alma düzeltildi: KullanımView.setPressed(boolean)

down.setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        enFront = 0;
        enBack = 1;
        left.setPressed(true);
        return true;
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        enBack = 0;
        v.performClick();
        v.setPressed(false);
        return false;
    } else {
        return false;
    }

0

yalnızca performClick yöntemini çağırın, şöyle:

@Override
public boolean onTouch(View v, MotionEvent event) {
    v.performClick();
    Tools.hideKeyboard(getActivity(), getView());
    getView().clearFocus();
    return false;
}   

0

A ile benzer bir sorun yaşadım MultiTouchListenerve bunu a uygulayarak GestureDetectorçözdüm ve a için dinledim SingleTap(Bu uyarıyı kaldırmaz, ancak görüşümdeki onClickolayları tetiklemeye başlar )

class TouchListener(context: Context) : MultiTouchListener() {

    private var tochedView: View? = null
    private var mGestureDetector = CustomGestureDetector()
    private var gestureDetector: GestureDetector = GestureDetector(context, mGestureDetector)

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        val aux = super.onTouch(view, event)

        tochedView = view
        gestureDetector.onTouchEvent(event)

        return aux
    }

    private inner class CustomGestureDetector: GestureDetector.SimpleOnGestureListener() {

        override fun onSingleTapUp(e: MotionEvent?): Boolean {
            // this will be called even when a double tap is
            tochedView?.performClick()
            return super.onSingleTapUp(e)
        }

        override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
            // this will only be called after the detector is confident that the
            // user's first tap is not followed by a second tap leading to a double-tap gesture.
            tochedView?.performClick()
            return super.onSingleTapConfirmed(e)
        }

    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.