2011-12-27 23 views
28

Özel denetimlerde, declare-styleable gibi XML kullanarak (paket ek parametreleri kullanmadan) Android dilindeki özel öznitelikleri tanımlamak istiyorum. Ama AttrSet parametreli kurucular yok, bu mümkün mü? Özellik desteği almak için public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState)'u geçersiz kılabilir miyim?Android parçalarındaki özel özelikler

+0

: '... \ app \ res \ layout \ select_category.xml: 26: hata: nitelik 'showRadioButtons bulunamadı kaynak tanımlayıcı 'paket içinde' com.companyX.projectY ' ... \ app \ res \ layout \ select_category.xml: 26: hata:' com.companyX.projectY 'paketindeki' highlightSelection 'özniteliği için hiçbir kaynak tanımlayıcısı bulunamadı. .. . \ app \ res \ layout \ select_category.xml: 26: hata: 'com.companyX.projectY'' paketinde' unselectedColor 'özniteliği için hiçbir kaynak tanımlayıcısı bulunamadı – Anton

+0

app xml ad alanı ve declare-stylable düzeltildi ectly. Gerekirse, – Anton

cevap

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

İşleri sağlayabilir, ancak Lint işaretleyicilerini temizlediğinizden emin olun (Android Araçlar> Lint İşaretleyicilerini Temizle). Neden inşa edilmediğini anlamaya çalışırken 10mn harcadım! – tdevaux

+0

Teşekkürler tdevaux, bunu tekrar okumadan önce sadece 5 dakika harcadım. Hayatımda 5 dakika daha var! – dhaag23

71

Support4Demos için Bağlantı değiştirildi veya tam bir çözüm gönderilmesi için değiştirilebilir. İşte gidiyor.

  1. attrs.xml res içinde dosyası oluşturun/klasörü değer verir. Veya dosya zaten varsa aşağıdaki içeriği ekleyin. Bunun

    /** 
    * 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(); 
    } 
    
  2. yılında

    <?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> 
    
    parçanın

  3. geçersiz kılma onInflate temsilci ve okuma nitelikleri aşağıdaki gibi düzen dosyasında bu özellikleri geçirin. Sadece bir örnek

    <?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> 
    

Hepsi bu. Onun çalışan bir çözüm.

Bunu yaparken, xml'de herhangi bir ad alanı hatası görüyorsanız. proje temizliğini tekrar tekrar deneyin. Bu, acıklı ama tutulur ve bazen yanıltıcıdır.

diğerlerini :)

Şerefe yardımcı Umut derlenirken hataları alınıyor

+2

Android Studio'm, XML'deki özel öznitelikleri kırmızı bir çizgi ile göstererek bir hata olduğunu gösteriyordu, ancak tüm proje gayet iyi. FYI, düzen dosyasında bu hatayı doğru bir şekilde yaptıklarını düşünmeyen biri için. – Pocha

+1

, xmlns: app = "http://schemas.android.com/apk/res/com.yourapp.packagename" yerine otomatik olarak "http: // schemas.android.com/apk/res-auto" komutunu kullanabilirsiniz. -substitute paket adı. http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –

+0

Tamam Daha önce bunu kaçırdım. Eğer siz de benim gibi kopyalayın, bunu birkaç yere yapıştırın, dikkat edin ve ad alanlarının eşleştiğinden emin olun, ör. ** xmlns: $ {NameSpace} ** ve aynı özellikte ** $ {NameSpace} **: attribute = "..." – TacB0sS