如何在Android / Java中根据特定的起始/结束号正确生成随机整数?

时间:2019-06-03 18:49:24

标签: java android xml android-layout

我正在尝试创建一个Android应用,该应用接受用户输入的“从”数字和“到”数字(一个范围),然后从该范围内生成一个随机整数。我在number inputType中使用了2个EditText,以便用户可以输入其唯一值,然后尝试在相应的Java文件中使用EditText(两个文件都附在下面)。

我看着hereherehere

但是,Android Studio可以构建(编译)我的应用程序,但是当我在模拟器中运行该应用程序(在添加此逻辑之前已经运行)时,它甚至拒绝加载Activity,而是说“不幸的是,[ App]已停止。”我认为这与将“ addTextChangedListener”代码的某些部分保留为空白有关,但是我不知道确切该放在哪里(我从上面链接的示例中获取了它)。

我到底在做错什么,我该如何解决使代码正常运行的问题?也许还有一种我还没有发现的简单方法...

谢谢!

这是我的XML活动代码:

    <EditText
        android:id="@+id/editText_from"
        android:ems="10"
        android:gravity="center"
        android:hint="@string/string_from"
        android:importantForAutofill="no"
        android:inputType="number" />

    <EditText
        android:id="@+id/editText_to"
        android:ems="10"
        android:gravity="center"
        android:hint="@string/string_to"
        android:importantForAutofill="no"
        android:inputType="number" />

这是我的Java代码:

package com.example.appname;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class NumberActivity extends AppCompatActivity {
    private EditText editTextFrom;
    private EditText editTextTo;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_number);
        editTextFrom = (EditText) findViewById(R.id.editText_from);
        editTextTo = (EditText) findViewById(R.id.editText_to);
        editTextFrom.setText(editTextFrom.getEditableText());
        editTextTo.setText(editTextTo.getEditableText());
        final int fromValue = 0;
        editTextFrom.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // What do I put here?
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // What do I put here?
            }

            @Override
            public void afterTextChanged(Editable s) {
                editTextFrom.setText(fromValue);
            }
        });
        final int toValue = 0;
        editTextTo.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // What do I put here?
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // What do I put here?
            }

            @Override
            public void afterTextChanged(Editable s) {
                editTextFrom.setText(toValue);
            }
        });
        int randomNum = ThreadLocalRandom.current().nextInt(fromValue, toValue);
        return;
    }
}

2 个答案:

答案 0 :(得分:1)

因此,您需要生成一定范围之间的随机数。您有一个按钮,单击该按钮时需要生成该随机数。那是什么意思呢?这意味着您无需添加editText.addTextChangedListener即可连续收听文本更改。

第1步。创建一个名为generateRandomNumber的方法。

private int generateRandomNumberBetweenRange(int from, int to){
    return ThreadLocalRandom.current().nextInt(fromValue, toValue);
}

步骤2:将onClickListener设置为XML中具有的按钮,然后在此按钮的onClick中,从EditText获取值,并将这些值传递给在步骤1中创建的函数。

button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
              int fromValue = Integer.parseInt(fromValueEditText.getText().toString());
              int toValue = Integer.parseInt(toValueEditText.getText().toString());
              int randomNumber = generateRandomNumberBetweenRange(fromValue, toValue);
              //Your random Number is generated, you can now do whatever you want with it.
              }
          });

答案 1 :(得分:0)

我不确定这是否正是您的问题,但似乎您将fromValuetoValue都设置为final,这意味着它们都设置为0后就无法更改。这意味着您的int randomNum = ThreadLocalRandom.current().nextInt(fromValue, toValue);总是尝试调用nextInt(0,0),根据Javadocs here的说法,它将抛出IllegalArgumentException