2011-12-27 17 views
28

Chciałbym zdefiniować niestandardowe atrybuty w fragmencie Androida przy użyciu języka XML (bez użycia dodatkowych parametrów pakietu), takich jak declare-styleable w niestandardowych formantach. Ale nie ma konstruktorów z parametrami AttrSet, więc czy to możliwe? Czy mogę po prostu zastąpić public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState), aby uzyskać wsparcie dla atrybutów?Niestandardowe atrybuty w fragmentach Androida

+0

Pierwsze błędy podczas kompilacji: '... \ app \ Res \ layout \ select_category.xml: 26: Błąd: identyfikator zasobu znalezionych dla atrybutu„showRadioButtons 'in package' com.companyX.projectY ' ... \ app \ res \ layout \ select_category.xml: 26: error: Nie znaleziono identyfikatora zasobu dla atrybutu "highlightSelection" w pakiecie "com.companyX.projectY' .. . \ app \ res \ layout \ select_category.xml: 26: error: Nie znaleziono identyfikatora zasobu dla atrybutu "unselectedColor" w pakiecie 'com.companyX.projectY'' – Anton

+0

Przestrzeń nazw xml aplikacji i declare-stylable są zapisane corr ectly. może je dostarczyć, w razie potrzeby – Anton

Odpowiedz

1
@Override 
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes 
} 
+2

Działa, ale upewnij się, że wyczyściłeś znaczniki Lint (Narzędzia Android> Wyczyść znaczniki kłód). Spędziłem 10 milionów próbując dowiedzieć się, dlaczego nie buduje! – tdevaux

+0

Dziękuję tdevaux, spędziłem tylko 5 minut przed ponownym przeczytaniem tego. Mam 5 minut więcej w moim życiu! – dhaag23

71

Link do Support4Demos został zmieniony lub może zostać zmieniony, więc opublikowanie kompletnego rozwiązania. Oto jest.

  1. Tworzenie attrs.xml plik RES/wartości folder. Lub dodaj poniższą treść, jeśli plik już istnieje.

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
    <declare-styleable name="MyFragment"> 
        <attr name="my_string" format="string"/> 
        <attr name="my_integer" format="integer"/> 
    </declare-styleable> 
    

  2. przesłonić onInflate delegat fragmentu i czytać atrybuty w nim

    /** 
    * Parse attributes during inflation from a view hierarchy into the 
    * arguments we handle. 
    */ 
    @Override 
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
        super.onInflate(activity, attrs, savedInstanceState); 
        Log.v(TAG,"onInflate called"); 
    
        TypedArray a = activity.obtainStyledAttributes(attrs,R.styleable.MyFragment); 
    
        CharSequence myString = a.getText(R.styleable.MyFragment_my_string); 
        if(myString != null) { 
         Log.v(TAG, "My String Received : " + myString.toString()); 
        } 
    
        int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1); 
        if(myInteger != -1) { 
         Log.v(TAG,"My Integer Received :" + myInteger); 
        } 
    
        a.recycle(); 
    } 
    
  3. Przełóż te atrybuty w pliku układu w następujący sposób. Tylko przykład

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:app="http://schemas.android.com/apk/res-auto" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" > 
    
        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="This is android activity" /> 
    
        <fragment 
         android:id="@+id/ad_fragment" 
         android:name="com.yourapp.packagename.MyFragment" 
         android:layout_width="fill_parent" 
         android:layout_height="50dp" 
         android:layout_alignParentBottom="true" 
         app:my_string="Hello This is HardCoded String. Don't use me" 
         app:my_integer="30" /> 
    
    </RelativeLayout> 
    

To wszystko. To działające rozwiązanie.

Robiąc to, jeśli widzisz jakiś błąd przestrzeni nazw w xml. spróbuj ponownie wykonać czyszczenie projektu. To jest czasami żałosne, ale zaćmienie i złe zachowanie.

Nadzieję, że pomaga innym :)

Cheers

+2

Moje Android Studio wyświetlało niestandardowe atrybuty w formacie XML z czerwonym podkreśleniem wskazującym na błąd, ale cały projekt został zbudowany poprawnie. FYI dla kogoś, kto może pomyśleć, że nie robi tego dobrze patrząc na ten błąd w swoim pliku układu. – Pocha

+1

możesz użyć 'http: // schemas.android.com/apk/res-auto' zamiast xmlns: app =" http://schemas.android.com/apk/res/com.yourapp.packagename "na auto -substitute nazwa pakietu. http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –

+0

OK Tęskniłem za tym wcześniej. Jeśli, tak jak ja, kopiuję wklejone to z kilku miejsc, zwróć uwagę i upewnij się, że przestrzenie nazw są zgodne, np. ** xmlns: $ {NameSpace} ** i to samo w atrybucie ** $ {NameSpace} **: attribute = "..." – TacB0sS

Powiązane problemy