OnClickListener和Toast不合作

时间:2014-01-09 08:42:18

标签: java android eclipse

我一直在为Android应用程序分配这个程序,虽然Eclipse没有代码问题,我的手机似乎无法运行它。我是Android编程的新手,所以请耐心等待。

这个Android应用程序是一个简单的“猜我的号码”游戏中的空白活动。用户从1-100开始猜测,在EditText视图中输入他们的答案,并按一下按钮提交。设计很好,但让它与OnClickListener一起使用是一件麻烦事。按下按钮后,应用程序在我的GS3上崩溃。最令人不安的部分是让按钮动作并以Toast的形式提供输出。

附件是MainActivity.java的代码。

我设法通过StackOverflow获取不同的代码片段以及我所知道的一些Java。结果不完美;不过值得一试。

您可能会看到我的complete project here。感谢您的时间,我感谢您能得到的任何帮助。

package com.lookjohn.guessnumber;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
Random random; 
Button button;
EditText text;

int input; 
int MIN = 1, MAX = 100;
int comp;
int guesses;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    random = new Random();
    button = (Button)findViewById(R.id.button1);
    text = (EditText)findViewById(R.id.editText1);
    comp = random.nextInt(MAX - MIN + 1) + MIN;
    guesses = 0;

    button.setOnClickListener(myhandler1);
}

View.OnClickListener myhandler1 = new View.OnClickListener() {

    public void onClick(View v) {
        String value = text.getText().toString(); // Get value from input from editTextView
        input = Integer.parseInt(value); // Turn string into integer

        do{
            guesses++;
            if(input > comp)
                Toast.makeText(MainActivity.this, 
                    "Number is too big.", 
                    Toast.LENGTH_SHORT).show();
            else if (input < comp)
                Toast.makeText(MainActivity.this, 
                    "Number is too small.", 
                    Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(MainActivity.this, 
                    "Good job! That was correct." +
                    "You made " + guesses + " guesses.", 
                    Toast.LENGTH_SHORT).show();
        } while(input != comp);

    }
};

2 个答案:

答案 0 :(得分:0)

编辑:我在您的代码中发现了其他一些问题。首先,您的EditText的输入类型是手机。它应该是数字。此外,用户可以提交空白编辑文本,这会在您致电parseInt时导致应用崩溃。我已经在下面的代码中进行了一些更改。


问题出在你的循环中。按下提交后,您将进入无限循环。我认为您希望用户能够提交多个猜测。但是如果用户输入了“3”并且你的计算值是“10”,那么你所有的循环都在做一遍又一次地确定3!= 10。这会导致UI冻结。

删除while循环将允许Toast显示:

public void onClick(View v) {

        // If you want to implement a max number of guesses, detect the 
        // number of guesses and return from the method.
        if (guesses > 5) {
            Toast.makeText(MainActivity.this, "Out of guesses!", Toast.LENGTH_SHORT);
            return;
        }

        String value = text.getText().toString(); // Get value from input from editTextView
        // If the user submits an empty EditText, return so we don't crash when parsing int
        if (value.isEmpty()) {
            Toast.makeText(MainActivity.this, "You must enter a guess!", Toast.LENGTH_SHORT);
            return;
        }
        input = Integer.parseInt(value); // Turn string into integer
        guesses++;
        if(input > comp)
            Toast.makeText(MainActivity.this, 
                "Number is too big.", 
                Toast.LENGTH_SHORT).show();
        else if (input < comp)
            Toast.makeText(MainActivity.this, 
                "Number is too small.", 
                Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(MainActivity.this, 
                "Good job! That was correct." +
                "You made " + guesses + " guesses.", 
                Toast.LENGTH_SHORT).show();

    }

在main.xml中,将inputType从phone更改为number

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/button1"
    android:layout_alignRight="@+id/button1"
    android:layout_centerVertical="true"
    android:ems="10"
    android:inputType="number" />

答案 1 :(得分:0)

您已在点击侦听器中为guess变量创建了无限循环,该变量始终会递增并且不会停止。

只需删除do{...}while循环然后尝试即可。因为似乎不需要任何使用它。

        if(input > comp)
            Toast.makeText(MainActivity.this, 
                "Number is too big.", 
                Toast.LENGTH_SHORT).show();
        else if (input < comp)
            Toast.makeText(MainActivity.this, 
                "Number is too small.", 
                Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(MainActivity.this, 
                "Good job! That was correct." +
                "You made " + guesses + " guesses.", 
                Toast.LENGTH_SHORT).show();