NullPointerException при использовании <include>android - PullRequest
2 голосов
/ 14 июня 2011

У меня есть активность, которая показывает игровой экран. Одним из элементов пользовательского интерфейса является поле оценки. Поле оценки - это в основном макет таблицы с четырьмя строками. Все строки одинаковы, здесь xml представляет одну строку.

<TableRow
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/farkle_image"
        android:src="@drawable/icon"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />
    <TextView
        android:id="@+id/name_text"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Name" />
    <TextView
        android:id="@+id/temp_score_text"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Temp Score" />
    <TextView
        android:id="@+id/score_text"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Score" />
</TableRow>

Каждая строка имеет вид изображения, текстовое представление, представляющее имя игрока, и два других текстовых вида, представляющих различные оценки.

Вот что я делаю в макете, используемом в упражнении:

<TableLayout
        android:id="@+id/score_box"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/score_button">

        <include
            layout="@layout/score_box_row"
            android:id="@+id/row_1" />

        <include
            layout="@layout/score_box_row"
            android:id="@+id/row_2"
            android:layout_below="@+id/row_1" />

        <include
            layout="@layout/score_box_row"
            android:id="@+id/row_3"
            android:layout_below="@+id/row_2" />

        <include
            android:id="@+id/row_4"
            layout="@layout/score_box_row"
            android:layout_below="@+id/row_3" />

    </TableLayout>

В игру можно играть с 2-4 игроками, поэтому я хотел установить для параметра Видимость строк без соответствующего игрока View.GONE.

Единственная проблема в том, что я не могу "найти" строки. findViewById () возвращает ноль. Этот метод вызывается из onCreate () сразу после setContentView ()

private void initializeArrays() {

        TableLayout table = (TableLayout) findViewById(R.id.score_box);
        Log.w(getClass().getName(), "Child Count: " + table.getChildCount());

        rows = ArrayList<TableRow>();    
        rows.add((TableRow) findViewById(R.id.row_1)); //Line 95
        rows.add((TableRow) findViewById(R.id.row_2));
        rows.add((TableRow) findViewById(R.id.row_3));
        rows.add((TableRow) findViewById(R.id.row_4));

        letters[0] = R.drawable.f;
        letters[1] = R.drawable.a;
        letters[2] = R.drawable.r;
        letters[3] = R.drawable.k;
        letters[4] = R.drawable.l;
        letters[5] = R.drawable.e;

    }

Я всегда получаю исключение NullPointerException в время выполнения . TableRows есть, потому что table.getChildCount () возвращает 4. Я не уверен, что не так.

Это ошибка с Android или ошибка с затмением?

РЕДАКТИРОВАТЬ: В соответствии с запросом здесь стек:

06-14 15:59:40.437: WARN/dalvikvm(1587): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587): FATAL EXCEPTION: main
06-14 15:59:40.441: ERROR/AndroidRuntime(1587): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mikgonz.farkle/com.mikgonz.farkle.ui.GameScreen}: java.lang.NullPointerException
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.os.Looper.loop(Looper.java:130)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread.main(ActivityThread.java:3835)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at java.lang.reflect.Method.invokeNative(Native Method)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at java.lang.reflect.Method.invoke(Method.java:507)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at dalvik.system.NativeStart.main(Native Method)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587): Caused by: java.lang.NullPointerException
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at com.mikgonz.farkle.ui.GameScreen.initializeArrays(GameScreen.java:95)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at com.mikgonz.farkle.ui.GameScreen.onCreate(GameScreen.java:48)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
06-14 15:59:40.441: ERROR/AndroidRuntime(1587):     ... 11 more

Ответы [ 3 ]

1 голос
/ 15 июня 2011
findViewById(R.id.row_1)

, вероятно, возвращает null. Вы звонили setContentView() и т. Д., Чтобы этот идентификатор действительно был в поле зрения? Вы не можете найти какой-либо случайный идентификатор с findViewById(), он выглядит именно в текущем наборе contentView или материала, который вы добавили к нему.

1 голос
/ 15 июня 2011

Во-первых, похоже, что это должно быть

rows = new ArrayList<TableRow>();

Я удивлен, что эта строка скомпилирована вообще, если бы она это сделала.

Кроме того, и это было бы глупой ошибкойУбедитесь, что файл макета score_box_row действительно существует и правильно определяет макет.

1 голос
/ 14 июня 2011

Похоже, что ваш Score_box использует android:layout_width="fill_parent", в то время как ваш основной TableLayout использует android:layout_width="match_parent". Один из них, вероятно, неверен, что не позволяет правильно скомпилировать ваш XML.

Я попробовал ваше приложение, скомпилировав для SDK 2.1 и используя "fill_parent" для обоих этих значений, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...