2009-11-11 8 views

Odpowiedz

69

Na this thread, R.styleable został usunięty z Androida w wersji 1.5 lub nowszej.

Istnieje wiele sposobów, aby uzyskać próbkę do pracy, najprostszym że znalazłem zostało zasugerowane przez Justin Anderson w wątku związanego powyżej:

  1. Utwórz nowy plik XML o nazwie „zasoby. xml”o następującej treści:

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
        <declare-styleable name="Gallery1"> 
         <attr name="android:galleryItemBackground" /> 
        </declare-styleable> 
    </resources> 
    
  2. Umieść plik XML w res \ ceni katalogu (obok strings.xml)

  3. Up data konstruktor dla ImageAdapter z następujących czynności (zakładając klasę ImageAdapter jest zdefiniowany w oddzielnym pliku):

    public ImageAdapter(Context c) { 
        mContext = c; 
        TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery1); 
        mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); 
        a.recycle(); 
    } 
    

To rozwiązanie zasadniczo definiuje atrybut styleable jako zasób samej aplikacji i daje mu niezbędna struktura do pracy w aplikacji. Zwróć uwagę, że aplikacja może działać poprawnie, jeśli pominiesz dwa wiersze kodu (przed a.recycle();), cały ten kod jest ustawiony na szarym tle wokół obrazów w Galerii.

+4

Myślę, że kilka tysięcy ludzi musiał mieć ten problem. – Ralphleon

+1

Tak, musiałem wykopać się przez chwilę, zanim znalazłem proste i praktyczne rozwiązanie, więc pomyślałem, że opublikuję to tutaj, aby ułatwić ludziom znalezienie. –

+1

Dzięki za to. Szkoda, że ​​nie zaktualizują samouczka! Przy okazji - musiałem nazwać element potomny zasobów, który można deklarować jako stylowy, tzn. Nie można go stylizować. –

11

Przyczyną tego problemu jest zasobów Mówią ci umieścić w RES/wartości/attrs.xml są:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="HelloGallery"> 
     <attr name="android:galleryItemBackground" /> 
    </declare-styleable> 
</resources> 

Ale wtedy masz ten adapter, który Eclipse nie może dowiedzieć się i szczerze nie ma sensu:

public ImageAdapter(Context c) { 
    mContext = c; 
    TypedArray a = obtainStyledAttributes(android.R.styleable.Theme); 
    mGalleryItemBackground = a.getResourceId(
      android.R.styleable.Theme_galleryItemBackground, 0); 
    a.recycle(); 
} 

To dlatego, że nie powinieneś mieć "androida". poprzednia zasób, nadająca się do stylowania nazwa to Motyw tutaj, ale HelloGallery w rzeczywistym zasobie, a galeriaItemBackground umieszcza androida między nadającą się do stylu nazwą i atrybutem takim jak ten: Theme_android_galleryItemBackground

Więc jeśli chcesz, aby metoda ImageAdapter działała z Twoimi zasobami " re podane, należy przepisać to tak:

public ImageAdapter(Context c) { 
    mContext = c; 
    TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery); 
    mGalleryItemBackground = a.getResourceId(
      R.styleable.HelloGallery_android_galleryItemBackground, 0); 
    a.recycle(); 
} 

dla przyszłych problemów dotyczących zasobów (R. * nie może być rozwiązany błędy typu), bada /gen/R.java na co środki są rzeczywiście nazwie.

+0

@YumYumYum Działa, jest to właściwa odpowiedź. –

1

Istnieje mieć mały błąd w wybranej odpowiedzi, zamiast łatwym do układania z styleable

To powinno słuszne:

<declare-styleable name="Gallery1"> 
    <attr name="android:galleryItemBackground" /> 
</declare-styleable> 
+0

NIE - Nie działa, nie właściwa odpowiedź. – YumYumYum

5

Nieco łatwiejsze, a na pewno bardziej MVCish sposobem jest użycie systemu stylu :

Jeśli jeszcze nie masz motywu, utwórz styles.xml pod numerem res/values.W nim, trzeba mieć:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="GalleryItem"> 
     <item name="android:background">?android:attr/galleryItemBackground</item> 
    </style> 
</resources> 

To będzie zdefiniować nowy styl, który wzywamy GalleryItem i ustawienie zasób Tło bez względu na styl zostanie zastosowany do, do wartości atrybutu stylu android:attr/galleryItemBackground (widać wiele przykładów tego jest zrobionych w źródle Androida w wersji frameworks/base/core/res/res/values/themes.xml).

Następnie w deklaracji XML dla ImageView, można po prostu zastosować styl GalleryItem dodając style="@style/GalleryItem", np:

<?xml version="1.0" encoding="utf-8"?> 
<ImageView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/icon" 
    android:scaleType="fitXY" 
    android:layout_width="136dip" 
    android:layout_height="88dip" 
    style="@style/GalleryItem" 
/> 

ten zachowa swój styl rzeczy z kodu karty (co jest dobre!) i pozwalają na bardziej ogólne adaptery, które nie muszą dbać o to, jak wizualizujesz swoje dane.

+0

Jak jednak podłączyć ImageView do galerii? Galeria jest dostarczana bez żadnych wewnętrznych elementów, które są zadeklarowane w XML. –

+0

Tak, galerie działają poprzez Adaptery, które zapewniają widoki. Konieczne będzie utworzenie adaptera, który spowoduje nadpisanie ImageView z xml. Zobacz przykład ApiDemos/src/com/example/android/apis/view/Gallery2.java. –

+0

Tak, to podejście jest o wiele czystsze, nawet jeśli chodzi o użycie deklarowanego przez Xml ImageView, w przeciwieństwie do kodu utworzonego. – superjos

3

styleable nie jest obsługiwana http://developer.android.com/sdk/RELEASENOTES.html

android.R.styleable klasa i jej obszary zostały usunięte z publicznych API, aby lepiej zapewnić kompatybilność w przód dla aplikacji. Stałe zadeklarowane w android.R.styleable były specyficzne dla platformy i podlegały arbitralnej zmianie w różnych wersjach, więc nie były odpowiednie do użycia przez aplikacje. Nadal możesz uzyskać dostęp do stylowych atrybutów platformy ze swoich zasobów lub kodu. Aby to zrobić, zadeklaruj niestandardowy element zasobów za pomocą <declare-styleable> w pliku projektu res/values/R.attrs, a następnie zadeklaruj atrybut wewnątrz. Przykłady: patrz <sdk>/samples/ApiDemos/res/values/attrs.xml. Aby uzyskać więcej informacji o zasobach niestandardowych, zobacz Niestandardowe zasoby układu. Zwróć uwagę, że dokumentacja Android.R.style jest wciąż dostępna w SDK, ale tylko jako odniesienie do stylów atrybutów platformy dla różnych elementów.

1

Próbowałem wszystkiego, ale bez powodzenia. Wygenerowany R.java pokazywał klasę stylable, ale kompilacja pokazywała "Stylable Not found". Właśnie dodałem nazwę pakietu przed R, po zmianie, wszystko działa bez zarzutu teraz ...

Dlatego, jeśli nazwa pakietu jest com.example.test, a następnie zmodyfikować następujący kod ...

public ImageAdapter(Context c) { 
mContext = c; 
TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery1); 
mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); 
a.recycle(); 

}

dO

public ImageAdapter(Context c) { 
    mContext = c; 
    TypedArray a = c.obtainStyledAttributes(com.example.test.R.styleable.Gallery1); 
    mGalleryItemBackground = a.getResourceId(com.example.test.R.styleable.Gallery1_android_galleryItemBackground, 0); 
    a.recycle(); 
} 
2

mam ten sam problem i znalazłem w kodzie niestandardowego widoku próbki (PieChart) Google

import com.example.android.customviews.R; 

Kiedy skomentuję tę linię importu, Eclipse zauważy błąd: "R nie może być rozwiązane dla zmiennej". więc powinieneś zaimportować swój pakiet podobne stwierdzenie powyżej. Ex:

import your.package.name.R; 

to naprawia błąd podobny do innych projektów kopalni

Powiązane problemy