Ich bekomme eine Null-Zeiger-Ausnahme in meiner benutzerdefinierten Ansicht (die von einem LinearLayout
abgeleitet ist), weil es seine untergeordneten Ansichten nicht finden kann. Hier ist der Code:Layout nicht aufgeblasen in android benutzerdefinierten Komponente
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.");
}
}
}
Hier ist das Layout (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>
Und hier ist, wie ich es in der XML-Datei setzen:
<com.example.views.MyView
android:id="@+id/my_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Aber wenn ich versuche, Um eine Vorschau im Layout-Editor zu erhalten, erhalte ich eine NPE unter mText.setText(...)
, weil getViewById()
null
zurückgibt.
Was ist los?
Klärung
Der Grund, warum ich dies funktioniert erwarten ist, wenn ich
tunMyView v = (MyView)inflater.inflate(R.layout.my_view);
((TextView)v.findViewById(R.id.text)).setText("Foo");
alles funktioniert. Ist das nicht der Layout-Inflator, wenn er eine Layout-Datei durchläuft? In jedem Fall, wie kann ich beide Situationen richtig behandeln (ohne sinnlose verschachtelte Ansichten)?
Wo ist ' 'a nd warum ist das nicht deine android: id-aussage, wo du es zuerst im layout deklarierst? –
codeMagic
Ich brauche keine ID dort. – Timmmm