Moja instrukcja dotycząca przełącznika działa wczoraj doskonale. Ale kiedy uruchomiłem kod wcześniej tego ranka, zaćmienie dało mi błąd podkreślając instrukcje przypadku kolorem czerwonym i mówi: wyrażenia przypadku muszą być stałymi wyrażeniami, są stałe, nie wiem, co się stało. Oto mój kod poniżej:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
Wszystkie R.id.int są podkreślone na czerwono.
java
android
switch-statement
HeartlessArchangel
źródło
źródło
R.id.playbtn
itp.? Czy wszystko jest statyczne i ostateczne?R
jest zwykle generowana przez narzędzia IDE / dev, więc zwykle jest poprawna dla używanej wersji Androida.Odpowiedzi:
W zwykłym projekcie systemu Android stałe w klasie R zasobu są deklarowane w następujący sposób:
public static final int main=0x7f030004;
Jednak od ADT 14 w projekcie biblioteki będą deklarowane w następujący sposób:
public static int main=0x7f030004;
Innymi słowy, stałe nie są ostateczne w projekcie biblioteki. Dlatego twój kod nie będzie się już kompilował.
Rozwiązanie tego jest proste: przekonwertuj instrukcję switch na instrukcję if-else.
public void onClick(View src) { int id = src.getId(); if (id == R.id.playbtn){ checkwificonnection(); } else if (id == R.id.stopbtn){ Log.d(TAG, "onClick: stopping srvice"); Playbutton.setImageResource(R.drawable.playbtn1); Playbutton.setVisibility(0); //visible Stopbutton.setVisibility(4); //invisible stopService(new Intent(RakistaRadio.this,myservice.class)); clearstatusbar(); timer.cancel(); Title.setText(" "); Artist.setText(" "); } else if (id == R.id.btnmenu){ openOptionsMenu(); } }
http://tools.android.com/tips/non-constant-fields
Możesz szybko przekonwertować
switch
instrukcję naif-else
instrukcję, korzystając z:W Eclipse
Przesuń kursor na
switch
słowo kluczowe i naciśnij Ctrl+, 1a następnie wybierzW Android Studio
Przesuń kursor na
switch
słowo kluczowe i naciśnij Alt+, Entera następnie wybierzźródło
final
słowa kluczowego zmienną można zmienić w czasie wykonywania.Odznaczenie „Is Library” w projekcie Właściwości zadziałało dla mnie.
źródło
Rozwiązanie można zrobić w ten sposób:
Przykład:
public static final int cameraRequestCode = 999;
Mam nadzieję, że to ci pomoże.
źródło
R.id. *, ponieważ ADT 14 nie są bardziej zadeklarowane jako końcowe statyczne int, więc nie można ich używać w konstrukcji przypadku przełącznika. Zamiast tego możesz użyć klauzuli if else.
źródło
Proste rozwiązanie tego problemu to:
Kliknij przełącznik, a następnie naciśnij CTL + 1, zmieni to przełącznik na instrukcję blokującą if-else i rozwiąże problem
źródło
Co powiesz na to inne rozwiązanie, aby zachować fajny przełącznik zamiast if-else:
private enum LayoutElement { NONE(-1), PLAY_BUTTON(R.id.playbtn), STOP_BUTTON(R.id.stopbtn), MENU_BUTTON(R.id.btnmenu); private static class _ { static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>(); } LayoutElement(int id) { _.elements.put(id, this); } public static LayoutElement from(View view) { return _.elements.get(view.getId(), NONE); } }
Więc w swoim kodzie możesz to zrobić:
public void onClick(View src) { switch(LayoutElement.from(src)) { case PLAY_BUTTTON: checkwificonnection(); break; case STOP_BUTTON: Log.d(TAG, "onClick: stopping srvice"); Playbutton.setImageResource(R.drawable.playbtn1); Playbutton.setVisibility(0); //visible Stopbutton.setVisibility(4); //invisible stopService(new Intent(RakistaRadio.this,myservice.class)); clearstatusbar(); timer.cancel(); Title.setText(" "); Artist.setText(" "); break; case MENU_BUTTON: openOptionsMenu(); break; } }
Wyliczenia są statyczne, więc będzie to miało bardzo ograniczony wpływ. Jedynym oknem do niepokoju byłoby podwójne wyszukiwanie (najpierw w wewnętrznej tablicy SparseArray, a później w tablicy przełączników)
To powiedziawszy, to wyliczenie można również wykorzystać do płynnego pobierania elementów, w razie potrzeby, zachowując odniesienie do id ... ale to już historia na inny czas.
źródło
Wyrzucał mi ten błąd, gdy używam przełącznika w funkcji ze zmiennymi zadeklarowanymi w mojej klasie:
private void ShowCalendar(final Activity context, Point p, int type) { switch (type) { case type_cat: break; case type_region: break; case type_city: break; default: //sth break; } }
Problem został rozwiązany, gdy zadeklarowałem
final
zmiennym na początku zajęć:final int type_cat=1, type_region=2, type_city=3;
źródło
enum
jestint
w tym przypadku lepszą alternatywą . Obiekt wywołujący metody nie będzie mógł wywołać funkcji o nieprawidłowym typie.i have specific int types so its ok if i use ints
To naprawdę nie ma sensu. Odnośnie przykładu wyliczenia: docs.oracle.com/javase/tutorial/java/javaOO/enum.htmli mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anything
To jest twoje założenie. Ktoś inny może wywołać funkcję niepoprawnie z dowolnym numerem. Dziękienum
, nie trzeba zakładać, że jest egzekwowane przez język.Chciałbym o tym wspomnieć, z taką samą sytuacją spotkałem się, gdy próbowałem dodać bibliotekę do swojego projektu. Nagle wszystkie instrukcje switch zaczęły pokazywać błędy!
Teraz próbowałem usunąć dodaną bibliotekę, nawet wtedy nie działała. jednak „ kiedy wyczyściłem projekt ”, wszystkie błędy po prostu odpadły!
źródło
Po prostu zadeklaruj swoją zmienną jako ostateczną
źródło