5

Otrzymuję wyjątek wskaźnika pustego w moim widoku niestandardowym (który pochodzi z LinearLayout), ponieważ nie może znaleźć widoków podrzędnych. Oto kod:Układ nie jest zawyżany w niestandardowym komponencie systemu Android

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."); 
     } 
    } 
} 

Oto układ (my_view.xml):

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

A oto jak umieścić go w pliku XML:

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

Ale gdy próbuję aby wyświetlić podgląd w edytorze układu, otrzymuję NPE na mText.setText(...), ponieważ getViewById() zwraca null.

Co się dzieje?

Wyjaśnienie

Powodem Spodziewam się to do pracy, to czy ja

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

wszystko działa poprawnie. Czy to nie jest to, co robi pompaterie, gdy przechodzi przez plik układu? W każdym razie, w jaki sposób można poprawnie obsłużyć obie sytuacje (bez uzyskiwania bezsensownych widoków zagnieżdżonych)?

+0

Gdzie jest ' 'a nd dlaczego nie jest twoim stwierdzeniem "android: id", w którym po raz pierwszy zadeklarujesz je w układzie? – codeMagic

+0

Nie potrzebuję tam id. – Timmmm

Odpowiedz

4

W tobie plik XML próbujesz użyć niestandardowej klasy widoku (com.example.views.MyView), a jednocześnie próbujesz dodać tekst w środku. To nie jest możliwe.

Oto co trzeba zmienić:

Musisz nadmuchać plik XML w kodzie:

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

i zmodyfikować plik XML szablonu takiego:

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

Ale jeśli zrobię 'myview = (MyView) inflater.inflate (R.layout.my_view, null, false)' w innym kodzie działa dobrze. Może to błąd w edytorze layoutu (nie byłby pierwszy!). Dodatkowo powinieneś użyć '' jeśli zamierzasz to zrobić tak, jak napisałeś. – Timmmm

+0

Oczywiście, że działa. Chodzi o to, że cokolwiek wstawisz do elementu '' XML zostanie zignorowane. Dlatego nie można znaleźć TextView. – fiddler

+0

Nie Mam na myśli, jeśli następnie zrobić 'myview.findViewById (R.id.text)', który znajdzie widok dobrze. Wygląda na to, że nadmiarowy układ zachowuje się inaczej, jeśli nadpisuje komponent niestandardowy bezpośrednio podczas nadmuchiwania komponentu niestandardowego * wewnątrz * innego układu. Zaktualizuję pytanie, by wyjaśnić. – Timmmm

Powiązane problemy