2012-03-16 23 views
6

Pracuję nad kontrolą niestandardową dla systemu Android i chociaż próbowałem zrobić to, co zasugerowałem: here wydaje się, że coś robię źle.Przestrzeń nazw Android Custom Control

Oto mój kod, aby zobaczyć, czy ktoś może rozpoznać problem:

MyComponent.java

public MyComponent(Context context, AttributeSet attrs) 
{ 
    super(context); 
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); 
    CharSequence myId = arr.getString(R.styleable.MyComponent_identifier); 

    if (myId != null) 
    { 
    this.setIdentifier(myId.toString()); 
    } 

    Integer cds = arr.getInteger(R.styleable.MyComponent_cd_number, 0); 

    if(cds != null) 
    { 
    this.setCds(cds); 
    } 

    arr.recycle(); 
} 

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyComponent">  
    <attr name="cd_number" format="integer" /> 
    <attr name="identifier" format="string" /> 
    </declare-styleable> 
</resources> 

main.xml

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components" 
    android:id="@+id/table" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    ... 

    <my.test.package.MyComponent 
    android:id="@+id/hand" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_span="2" 
     bgl:cd_number="4" 
     bgl:identifier="plr"/> 

    ... 

    </TableLayout> 

Kiedy kładę to uzyskać następujące błędy:

błąd: Nie znaleziono identyfikator zasobu dla atrybutu „cd_number” w pakiecie „my.test.package” o błędzie: Nie znaleziono identyfikator zasobu dla atrybutu 'identyfikator' w pakiecie 'my.test.package'

Jeśli mogę zmienić nazw do czegoś podobnego:

xmlns:bgl="http://schemas.mywhatever.com/apk/res/my.test.package" 

... błędy iść w ay i rzecz działa, ale wartość myId ma wartość null, a cds to 0 (wartość domyślna!) z powrotem w konstruktorze MyComponent.java.

Powiedziałbym, że to bardzo prosty błąd, ale nie jestem w stanie go wykryć, a ponieważ nie ma zbyt wiele dokumentacji na ten temat, postanowiłem tutaj zapytać.

Z góry dziękuję!

Odpowiedz

14

Ok. Mam go rozwiązany!

na oryginalnym poście miałem:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package 

... ale w moim źródle miałem:

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components 

... bo myślałem, należy umieścić URI do pakietu komponentów .

TO NIE DZIAŁA!

Na xmlns powinna to być nazwa aplikacji zgłoszona w Manifestu!

Po usunięciu części "komponenty" z xmlns "dopasowała" nazwę aplikacji do Manifestu i błędy zniknęły, a kiedy uruchomiłem rzecz w debugowaniu, mogłem zobaczyć wartości, które przekazywałem do parametrów w XML!

Mam nadzieję, że to pomoże komuś innemu! :-)

UPDATE

Później miałem potrzebę przejścia kontroli do biblioteki i ponownie stanęła przed problemem. Wydaje się, że gdy umieścić komponent w bibliotece i użyć go w aplikacji klienckiej należy zadeklarować xmlns jak poniżej:

xmlns:myns="http://schemas.android.com/apk/res-auto" 

Jeśli tak (i ​​mieć bibliotekę zadeklarowany jako Android uzależnienia) Eclipse (czy to Android?) przeszuka zależności dla odpowiednich powiązań atrybutów.

+1

Doskonałe wyszukiwanie pracy i udzielanie odpowiedzi. poprawka res-auto jest dokładnie tym, czego potrzebowałem. – AlanKley

+0

"res-auto". Jesteś piękna! – darksider474

+0

co to są bgl i myns, jak mogę ustawić tę nazwę – Nepster

0

miałem problem podobny do tego, okazało się, że dzwoni inny konstruktor

spróbuj konstruktora, że ​​trwa w parametrze defStyle

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
+0

Dzięki, trygoty. Niestety mój problem wydaje się być inny. Zdefiniowałem ctor, który zasugerowałeś i jeśli nie zmieniam przestrzeni nazw, błędy nadal będą występować. Jeśli zmienię xmlns, będzie zachowywał się tak samo: nowy ctor nigdy nie jest wywoływany, a myId ma wartość null, a cds to 0, jak było wcześniej. Więcej pomysłów? Ktoś? –

Powiązane problemy