使按钮更改textview的值

Big*_*old 1 java variables android button textview

所以,我的朋友让我今天在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"/>
Run Code Online (Sandbox Code Playgroud)

这是试图更改文本视图值的代码.

public void addone(){

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

}
Run Code Online (Sandbox Code Playgroud)

程序编译并打开,但只要按下按钮就会崩溃.我相信我已经把罪魁祸首缩小到这条线,但我不知道为什么它不起作用

TextView t = (TextView) findViewById(R.id.counter);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Wil*_*son 9

重载方法是你的问题.它是微妙的,即使是经验丰富的程序员也可能犯的错误.我以前自己做过.

您正在调用TextView.setText(Integer).这会尝试加载资源ID为numtest的字符串,该字符串不存在.

试试这个:

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

这将调用TextView.setText(CharSequence),这是你真正想要做的.

此外,正如Osmium USA所示,您的方法签名不正确.按下的按钮回调方法必须接受视图,并且必须是公共的.


Osm*_*USA 6

当您为布局元素提供要执行的函数时,它会查找接受视图的名称(因此,如果您在XML中为多个元素分配相同的单击行为,则可以知道所点击的内容).

所以addone()必须addone(View v)

来自Button Docs

为了使其工作,该方法必须是公共的并接受View作为其唯一参数

威廉莫里森也有一个好点.您应该根据他所做的或使用整数类将该数字设为字符串:

t.setText(Integer(numtest).toString());
Run Code Online (Sandbox Code Playgroud)

要么

t.setText(numtest+"");
Run Code Online (Sandbox Code Playgroud)