Ö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
cevap
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
// Your code here to process the attributes
}
İş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
Teşekkürler tdevaux, bunu tekrar okumadan önce sadece 5 dakika harcadım. Hayatımda 5 dakika daha var! – dhaag23
Support4Demos için Bağlantı değiştirildi veya tam bir çözüm gönderilmesi için değiştirilebilir. İşte gidiyor.
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(); }
yılında
parçanın<?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>
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
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
, 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 –
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
: '... \ 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
app xml ad alanı ve declare-stylable düzeltildi ectly. Gerekirse, – Anton