TextSwitcher NullPointer错误

时间:2011-06-14 19:37:11

标签: android textview nullpointerexception android-ui

我真的被困在这上面了。我正在尝试做一个简单的文本交换器,它将增加数量并根据数量更新价格。现在在我的xml中,我在TextSwitcher中有类似TextView的东西,只是为了增加数量。我用findViewById(R.id.quantity)得到了textview。

所以我必须找到设置增量的数量(我正在实施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));

有人能让我知道我做错了吗?我一直在这一行得到我的nullpointer:

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 个答案:

答案 0 :(得分:25)

来自Documentation for 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 :(得分:1)

确保在查找TextSwitcher之前调用了setContentView

答案 2 :(得分:1)

嗯...有趣的是,我在这里遇到了同样的问题。在我的情况下有两个问题,首先我从makeView返回null。我相信不是你的情况,因为你从findViewById得到它的引用(但要注意,有时这个方法失败并返回一个空引用,我建议你在那里放一个断点并确保你没有空指针)。

我遇到的第二个问题(我认为这可能只是你的问题)显然TextSwitcher不希望有任何子视图,所以你不应该像你一样把TextView放在其中。尝试删除TextView并查看它是否有效。

答案 3 :(得分:1)

我在findViewById返回null时遇到了同样的问题。经过几个小时的挖掘,我终于能够解决问题:我的代码中存在错误。您很可能遇到类似的错误。

我的代码是(不是原始代码,仅用于说明目的):

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

错误在于构造函数调用。构造函数中的代码应更改为以下内容以使工作正常:

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

错误(以及其他类中的类似错误)可能导致findViewById看不到所有“新”定义的资源。

对我感到羞耻我今天两次犯同样的错误!