2011-02-04 15 views
49

Ok szukam tuż obok czegoś tutaj ..Android Resources konwersji na ciąg TypedValue ostrzeżenia

każdym razem, gdy jestem w mojej aplikacji i zmienić działalności, raporty logcat serii ostrzeżeń:

02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002b} 
02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002c} 
02-04 14:42:36.524: WARN/Resources(1832): Converting to string: TypedValue{t=0x12/d=0x0 a=2 r=0x7f08002d} 

Inne aplikacje nie wyświetlają takich ostrzeżeń. Czy to jest kompresja przed wydaniem/nagraniem?

+0

możesz pisać jakiś kod pokazujący jak przełączasz działania? –

Odpowiedz

55

Używasz zasobu bool, w którym oczekuje się łańcucha.

można znaleźć który zasób jest używany nieprawidłowo otwierając wygenerowany plik R.java i poszukiwanie identyfikatorów zasobów z komunikatu logcat:

0x7f08002b 
0x7f08002c 
0x7f08002d 

Wszystkie trzy powinny być z pliku bool.xml ("t = 0x12" w komunikacie ostrzegawczym oznacza, że ​​zasoby są TYPE_INT_BOOLEAN).

Następnie znajdź, gdzie identyfikatory zasobów są używane w projekcie (prawdopodobnie układ xml, ale może być gdziekolwiek) i upewnij się, że typy są zgodne.

Oto przykład TextView, który wygeneruje ten komunikat dziennika. Jeśli w moim RES/Wartości/bool.xml mam:

<resources> 
    <bool name="foo_flag">false</bool> 
</resources> 

mogę niepoprawnie odnosić się do niego z aa układ pliku XML:

<TextView android:id="@+id/foo" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@bool/foo_flag"></TextView> 

Kiedy uruchomić tę aplikację, Wezmę komunikat ostrzegawczy, ponieważ "tekst" oczekuje zasobu ciągów znaków, a nie boola (moja aplikacja wygląda tak, jak się spodziewano, ponieważ flaga jest konwertowana na ciąg "fałsz").

+5

Dzięki Mike! Okazało się, że nie jest to zasób bool, ale sprawdzenie identyfikatorów zasobów było tym, czego potrzebowałem. Miałem android: text = "@ id/foo" - liczbę całkowitą @id w moim polu tekstowym TextView. – DJC

+2

Co ciekawe, moje środowisko (Eclipse z MOTODEV) domyślnie pola tekstowe TextView mają taką samą treść jak ich pola id. Fajnie jest zobaczyć identyfikatory w układzie, ale powoduje to ostrzeżenie w czasie wykonywania. Nie ma wątpliwości, że dla nawróconych istnieje również (pomniejsza?) Kara za wykonanie. – DJC

+0

dzięki Mike .. Pomógł mi .. – alchemist

3

Odkryłem, że to ostrzeżenie jest również wysyłane podczas określania ciągu w postaci liczby mnogiej z widgetu, który wymaga parametrów.

Na przykład:

<plurals name="song_count"> 
    <item quantity="one">%d song in playlist</item> 
    <item quantity="other">%d songs in playlist</item> 
</plurals> 

Ostrzeżenie pojawi się podczas pompowania działalności, który zawiera widżet przedstawieniu go:

<TextView 
    android:id="@+id/tv_total_songs" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@plurals/song_count" /> 

Bez wątpienia wymienić łańcuch po pompowania poglądy ustawić poprawne parametry, np .:

playlistSongCount.setText(
     getResources().getQuantityString(
      R.plurals.song_count, 
      songCount, 
      songCount)); 

Oczywistym rozwiązaniem jest tutaj usuń atrybut android:text z układu, ponieważ nie ma on żadnego celu.

2

Sprawdź, czy nie masz: -

<TextView android:text="@+id/labelText"/> 

w pliku zasobów.

0

Problem w android:text="@+id/fooText

przesiadkÄ w twojej.XML następująco:

<TextView 
    android:id="@+id/foo" 
    android:text="@+id/fooText"/> 

do tego:

<TextView 
    android:id="@+id/foo" 
    android:text=""/> 
60

Te komunikaty występowało tylko po pewnym rozwiązaniem wywoływacz została włączona.

Ustawienia urządzenia> Opcje programisty> Wyłącz Włącz widok inspekcję atrybut '

+0

Dzięki, to było to dla mnie :) –

+0

Za mało informacji. Jaką kontrolę atrybutów? –

+0

@BrillPappin Mam zaktualizowaną odpowiedź – Tobrun