4

所以,我的朋友今天让我在 android studio 中搞乱 android 编程。我开始制作一个初学者应用程序并取得了一些不错的效果。但现在我正在尝试获取一个按钮来更改文本视图的值。

这是按钮和文本视图的代码

<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);

有任何想法吗?

4

3 回答 3

10

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

您正在调用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 所展示的,您的方法签名不正确。按下按钮的回调方法必须接受一个视图,并且必须是公共的。

于 2013-07-30T22:59:01.070 回答
6

当您为布局元素提供要执行的功能时,它会查找接受 View 的名称(因此,如果您在 XML 中为多个元素分配相同的点击行为,您就知道点击了什么)。

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

来自按钮文档

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

威廉莫里森也有一个很好的观点。您应该通过他所做的或使用 Integer 类将该数字设为字符串:

t.setText(Integer(numtest).toString());

或者

t.setText(numtest+"");
于 2013-07-30T22:57:24.387 回答
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;
    }
}
于 2013-07-30T23:00:53.583 回答