Ошибки TextSwitcher NullPointer - PullRequest
       17

Ошибки TextSwitcher NullPointer

7 голосов
/ 14 июня 2011

Я действительно застрял на этом. Я пытаюсь сделать простой переключатель текста, который будет увеличивать количество и обновлять цену в зависимости от количества. Прямо сейчас в моем XML у меня есть что-то вроде TextView в TextSwitcher только для увеличения количества. Я получаю текстовое представление с findViewById(R.id.quantity).

так что это то, что я должен найти, чтобы установить величину приращения (я реализую ViewFactory)

switcher = (TextSwitcher) findViewById(R.id.switcher);
switcher.setFactory(this);
quantity = (TextView) findViewById(R.id.quantity);

Я также переопределяю makeView ()

@Override
     public View makeView() {
        return quantity;
    }

Также, когда нажата кнопка увеличения, я увеличиваю счетчик и устанавливаю текст на переключателе в текущий счет. Как это:

switcher.setText(String.valueOf(currentQuantity));

Может кто-нибудь сообщить мне, что я делаю не так? Я продолжаю получать свой нулевой указатель в этой строке:

switcher.setFactory(this);

Вот фрагмент XML:

<TextSwitcher android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/switcher">
            <TextView android:text="TextView" android:id="@+id/quantity" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        </TextSwitcher>

Ответы [ 4 ]

25 голосов
/ 25 ноября 2011

Из документации для TextSwitcher :

setText (CharSequence text) Устанавливает текст следующего представления и переключается на следующий вид. Это может быть использовано для анимации старого текста и анимировать следующий текст.

Это означает, что вам понадобится как минимум два просмотра текста, один со старым текстом, а другой для получения нового текста и анимации. Следующий XML должен работать:

    <TextSwitcher 
        android:id="@+id/counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </TextSwitcher>
1 голос
/ 27 сентября 2011

Ммм ... интересно, у меня просто была такая же проблема здесь. В моем случае было две проблемы, во-первых, я возвращал нуль из makeView. Я полагаю, что это не ваш случай, так как вы получаете его ссылку из findViewById (хотя следует помнить, что иногда этот метод завершается ошибкой и возвращает вам нулевую ссылку, я бы порекомендовал вам поставить точку останова и убедиться, что у вас нет нулевого указателя ).

Вторая проблема, с которой я столкнулся (и я думаю, что это может быть и ваша), заключается в том, что, очевидно, TextSwitcher не ожидает дочернего представления, поэтому вам не следует помещать в него TextView, как вы это делаете. Попробуйте удалить этот TextView и посмотрите, работает ли он.

1 голос
/ 16 ноября 2011

У меня та же странная проблема с findViewById, возвращающим ноль. После нескольких часов копания я наконец смог уловить проблему: это ошибка в моем коде. Вероятность того, что у вас есть подобные ошибки, велика.

Мой код был (не оригинальный код, для иллюстрации):

public class MyTextSwitcher extends TextSwitcher {
public MyTextSwitcher(Context context, AttributeSet attrs) {
    super(context);
}

Ошибка при вызове конструктора. Код в конструкторе должен быть изменен на следующий, чтобы заставить вещи работать:

super(context, attrs); // note the extra attrs parameter

Ошибка (и подобные ошибки в других классах) может привести к тому, что все "вновь" определенные ресурсы не будут видны findViewById.

Позор мне, сегодня я дважды совершал одни и те же ошибки!

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

Убедитесь, что вы позвонили setContentView, прежде чем искать TextSwitcher

...