制作一个按钮,使其可以改变文本视图中的值。

6

今天我的朋友让我尝试在Android Studio中进行Android编程。我开始制作一个初学者应用程序并取得了一些不错的成果。但是现在我正在尝试通过按钮来改变TextView的值。

以下是按钮和TextView的代码:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add one"
        android:id="@+id/button3"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignRight="@+id/textView"
        android:layout_toRightOf="@+id/button"
        android:onClick="addone"/>

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:id="@+id/counter"
        android:textSize="40dp"
        android:layout_alignTop="@+id/button3"
        android:layout_centerHorizontal="true"/>

这里是试图改变文本视图值的代码。

public void addone(){

    numtest+=1;
    TextView t = (TextView) findViewById(R.id.counter);
    t.setText(numtest);

}

该程序可以编译并打开,但每当我按下按钮时就会崩溃。我相信这个问题源自于这一行代码,但我不确定为什么它没有起作用。
TextView t = (TextView) findViewById(R.id.counter);

有什么想法吗?

请确保您检查logCat,它可以帮助您知道错误来自哪里。 - Hossam Oukli
3个回答

12

一个重载的方法是你的问题。即使是经验丰富的程序员也可能犯错,这是微妙的。我以前也犯过这种错误。

你正在调用 TextView.setText(Integer)。它试图加载一个资源id为numtest的字符串,但该字符串不存在。

请尝试使用以下代码:

public void addone(View v){
    numtest+=1;
    TextView t = (TextView) findViewById(R.id.counter);
    t.setText(numtest+"");
}

这将调用TextView.setText(CharSequence),这才是您真正想要做的事情。
此外,正如Osmium USA所演示的那样,您的方法签名是不正确的。按钮按下的回调方法必须接受一个视图,并且必须是公共的。

很好的解释,但我认为你应该指出方法签名中的错误。 - codeMagic
@codeMagic已经修复了。仅仅打出另一个用户的代码感觉不太对。我认为我的catch更重要,不过很快我们就会知道真正的答案是什么了。我敢打赌这是我的答案 :) 编译器毕竟无法捕捉到意外的重载方法调用。 - William Morrison
1
它们都同样重要,因为两者都是必需的。只要你在最初没有发现问题时给予信用,就不要感到难过。虽然它不能在编译时捕获错误,但在运行时仍然非常重要。 - codeMagic
谢谢。那很有道理。 - Bigandrewgold
@Bigandrewgold 谢谢,继续保持好工作。一定要给 Osmium 的答案点赞。 - William Morrison
1
一定要点赞Osmium的回答。看看你,说话像个真正的绅士和SO用户 ;) 这就是这个社区的精神...学习和尊重。 - codeMagic

6
当您给布局元素分配执行函数时,它会寻找该名称并接受一个View(因此,如果在XML中分配多个元素相同的单击行为,则知道点击了什么)。
因此,addone() 必须是 addone(View v) 来自按钮文档 引用: 为了使其起作用,该方法必须是公共的,并且仅接受View作为其参数。
William Morrison 也有一个好建议。您应该将该数字转换为字符串,可以像他所做的那样或使用 Integer 类:
t.setText(Integer(numtest).toString());

或者

t.setText(numtest+"");

我认为这不是问题,不过感谢你发现了方法签名定义。如果不是你,我可能会错过它。 - William Morrison
@WilliamMorrison 这不是唯一的问题,但如果没有正确的签名,它将无法找到该方法。 - codeMagic
1
很好的问题解释。您可能只想在文档中包含链接以供将来参考,以便人们确切地知道在哪里查找这些内容。 - codeMagic

0

这应该可以工作:

public void addone(View view){
    switch(view.getId())
    {
        case R.id.button3:
            numtest+=1;
            TextView t = (TextView) findViewById(R.id.counter);
            t.setText(Integer.toString(numtest));
        break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接