2017-10-26 12 views
5

Użyłem RatingBar w moim układzie jak 1 gwiazdka jak poniżej -widok klienta RatingBar ma setOnTouchListener nazwie na nim, ale nie zastępują performClick

<RatingBar 
      android:id="@+id/ratingBar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_below="@id/textViewReleaseDate" 
      android:layout_marginLeft="16dp" 
      android:layout_marginTop="16dp" 
      android:layout_toRightOf="@id/imageViewPoster" 
      android:numStars="1" 
      android:stepSize="1.0" /> 

I mieć setOnTouchListener w mojej działalności jak poniżej -

ratingBar.setOnTouchListener(new View.OnTouchListener() { 

     int ratingAtActionDown; 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 

      if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) 
       ratingAtActionDown = (int) ratingBar.getRating(); 
      else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
       ratingBar.setRating(ratingAtActionDown == 0 ? 1 : 0); 
      } 

      return true; 
     } 
    }); 

Na powyższym fragmencie jestem coraz to ostrzeżenie -

klienta view 'RatingBar' ma setOnTouchListener nazywa na nim, ale nie zastępują performClick

enter image description here

Na Android Studio 2.3.3 ratingBar.setOnTouchListener nie generuje ostrzeżenie, ale po uprading do Android Studio 3.0 stabilny zaczęło ostrzeżenie.

Co należy zrobić, aby pozbyć się ostrzeżenia?

+2

mam ten sam błąd, może to będzie ustalone na następną aktualizację? Ponieważ powiedział nam, aby zastąpić performClick, ponieważ sądzi, że użyliśmy niestandardowego widoku, ale tak nie jest. –

Odpowiedz

2

Wygląda na to, że Lint niesłusznie uważa, że ​​każdy widok nie implementujący metody performClick() jest widokiem niestandardowym. Wiedząc o tym, możemy zgadnąć, że poglądy, których dotyczy to ostrzeżenie, w rzeczywistości nie zawierają tej implementacji.

teraz, aby odpowiedzieć na to pytanie, być może trzeba rozszerzyć widok, który chcesz ustawić onTouchListener jeśli chcesz ostrzeżenie zniknie:

class TouchableRatingBar extends android.support.v7.widget.AppCompatRatingBar{ 

    public TouchableRatingBar(Context context) { 
     super(context); 
    } 
    @Override 
    public boolean performClick() { 
     return true; 
    } 
} 

zastąpić metodę performClick() i powinno być dobrze iść.

Należy zauważyć, że użyłem AppCompatRatingBar jako Lint wydaje się nie lubię robić inaczej.

Konieczne może być podwójne rzutowanie paska ocen lub zmiana jego typu w układzie.

Podwójna Obsada:

TouchableRatingBar ratingBar = (TouchableRatingBar)(RatingBar)findViewById(R.id.ratingBar); 

Nie użyłbym podwójną obsadę osobiście, ale jeśli trzeba mieć alternatywę dla prostu zmieniając typ w układzie może wykonać zadanie.

Rodzaj Zmiana:

<yourcompany.yourproject.TouchableRatingBar 
      android:id="@+id/ratingBar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_below="@id/textViewReleaseDate" 
      android:layout_marginLeft="16dp" 
      android:layout_marginTop="16dp" 
      android:layout_toRightOf="@id/imageViewPoster" 
      android:numStars="1" 
      android:stepSize="1.0" /> 
+0

Dzięki ... Użycie niestandardowego paska ocen było jedynym rozwiązaniem, w którym mogłem się pozbyć ostrzeżenia o lintach. –

Powiązane problemy