我真的被困在这上面了。我正在尝试做一个简单的文本交换器,它将增加数量并根据数量更新价格。现在在我的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>
答案 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)
我遇到的第二个问题(我认为这可能只是你的问题)显然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
看不到所有“新”定义的资源。
对我感到羞耻我今天两次犯同样的错误!