5

Benim özel görünümünde (LinearLayout türetilmiştir) boş bir işaretçi istisnası alıyorum çünkü bu onun alt görünümlerini bulamıyor. İşte Android özel bileşeni şişirilmiş değil düzen

public class MyView extends LinearLayout 
{ 
    public MyView(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public MyView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    private TextView mText; 

    @Override 
    protected void onFinishInflate() 
    { 
     super.onFinishInflate(); 
     mText = (TextView) findViewById(R.id.text); 

     if (isInEditMode()) 
     { 
      mText.setText("Some example text."); 
     } 
    } 
} 

düzeni ( my_view.xml) 'dir: burada

<?xml version="1.0" encoding="utf-8"?> 
<com.example.views.MyView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:ellipsize="end" 
     android:maxLines="4" 
     android:paddingLeft="8dp" 
     android:paddingRight="8dp" 
     android:text="Some text" /> 

</com.example.views.MyView> 

Ve XML dosyasında koymak nasıl edilir: İşte kod

<com.example.views.MyView 
     android:id="@+id/my_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

Ama çalıştıklarında düzeni düzenleyicisinde önizlemek için getViewById()null döndürdüğünden mText.setText(...) üzerinde bir NPE alıyorum.

Neler oluyor? Ben

MyView v = (MyView)inflater.inflate(R.layout.my_view); 
((TextView)v.findViewById(R.id.text)).setText("Foo"); 

her şey çalışıyor yaparsanız

Açıklama

Ben bu çalışmasını bekliyoruz nedeni vardır. Bir düzen dosyasından geçtiğinde, düzen düzenleyicisinin yaptığı bu değil midir? Her durumda, her iki durumu doğru olarak nasıl ele alabilirim (iç içe geçmiş görünümler almadan)?

+0

:

Sen kodunda XML dosyası şişirmek gerekir:

public MyView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); LayoutInflater.from(context).inflate(R.layout.<your_layout>.xml, this); } 

Ve böyle XML düzeni dosyasını değiştirmek İşte

değiştirmeniz gereken budur 'a nd neden düzende ilk bildirdiğiniz 'android: id' ifadeniz olmasın? – codeMagic

+0

Orada bir kimliğe ihtiyacım yok. – Timmmm

cevap

4

XML dosyasında, özel bir görünüm sınıfı (com.example.views.MyView) kullanmaya çalışıyorsunuz ve aynı zamanda içeride bir TextView eklemeye çalışıyorsunuz. Bu mümkün değil. 'Nerede

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/text" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:gravity="center" 
    android:ellipsize="end" 
    android:maxLines="4" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" 
    android:text="Some text" /> 

</LinearLayout> 
+0

Ama eğer başka bir kodda myview = (MyView) inflater.inflate (R.layout.my_view, null, false) 'yi kullanırsam iyi çalışır. Belki de düzen editöründeki bir hatadır (ilk siz olmaz!). Ayrıca, yazdığınız şekilde yapacaksanız, '' kullanmalısınız. – Timmmm

+0

Elbette işe yarıyor. Sadece 'XML elemanının içine koyduğunuz her şey göz ardı edilecektir. Bu yüzden TextView bulunamıyor. – fiddler

+0

Hayır Daha sonra görüntüyü iyi bulur 'myview.findViewById (R.id.text)' diyorum. Özel bileşeni * içeride * başka bir düzende şişirirken doğrudan özel bileşeni şişiriyorsa, düzen enfartörü farklı davranır gibi görünüyor. Netleştirmek için soruyu güncelleyeceğim. – Timmmm

İlgili konular