繁体   English   中英

根据边数掷骰子

[英]Rolling a dice based on number of sides

编辑:请参阅随附的错误日志。

我正在尝试创建一个简单的应用程序来在Android Studio中滚动不同的骰子。 到目前为止,这是我的代码:MainActivity.java

package com.example.thomb.tutorialspoint;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.buttonRoll);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            int roll = RollDice(sidesChosen);
            TextView tv1 = (TextView)findViewById(R.id.textView);
            tv1.setText(roll);
            setContentView(tv1);
        }
    });
}

public int sidesChosen;
public int RollDice(int sides) {
    Random r = new Random();
    return r.nextInt(sides)+1;
} //method
public void onRadioButtonClicked(View view) {
    // Is the button now checked?
    boolean checked = ((RadioButton) view).isChecked();

    // Check which radio button was clicked
    switch(view.getId()) {
        case R.id.radioButtonD4:
            if (checked)
                sidesChosen = 4;
                break;
        case R.id.radioButtonD6:
            if (checked)
                sidesChosen = 6;
                break;
        case R.id.radioButtonD8:
            if (checked)
                sidesChosen = 8;
                break;
        case R.id.radioButtonD10:
            if (checked)
                sidesChosen = 10;
                break;
        case R.id.radioButtonD12:
            if (checked)
                sidesChosen = 12;
                break;
        case R.id.radioButtonD20:
            if (checked)
                sidesChosen = 20;
                break;
    } //switch
} //method
} //class

这是布局的样子: http : //i.imgur.com/IeIbMlz.png

单击滚动按钮时,应用程序崩溃,但我不知道为什么。 ID均正确,单选按钮按预期工作。 我正在使用API​​级别25。我对Java还是很陌生,但是我对C#相当熟悉,因此问题可能出在代码语法上,尽管Android Studio没有报告错误。 让我知道您是否还需要查看布局的XML。

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.thomb.tutorialspoint, PID: 5029
              java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                  at android.view.ViewGroup.addViewInner(ViewGroup.java:4310)
                  at android.view.ViewGroup.addView(ViewGroup.java:4146)
                  at android.view.ViewGroup.addView(ViewGroup.java:4087)
                  at android.view.ViewGroup.addView(ViewGroup.java:4060)
                  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:279)
                  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:145)
                  at com.example.thomb.tutorialspoint.MainActivity$1.onClick(MainActivity.java:25)
                  at android.view.View.performClick(View.java:5280)
                  at android.view.View$PerformClick.run(View.java:21239)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:234)
                  at android.app.ActivityThread.main(ActivityThread.java:5526)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

setText()是一种具有两种类型的重载方法:一种使用String ,另一种采用int 这里的int应该是字符串资源ID。 这是您的错误所在。 在下面的代码中,您正在使用setText(int) ,但未传递有效的字符串资源ID。

int roll = RollDice(sidesChosen);
...
tv1.setText(roll);

setText(String.valueOf(roll)首先将其转换为String

日志发布后编辑:

错误的原因是您将0传递给nextInt()方法。 之所以会发生这种情况,是因为您从未选择过RadioButton(默认情况下sidesChosen为0),或者即使选择了RadioButton之后,也不会输入任何switchcase

在第二个日志发布后编辑:(...)

删除setContentView(tv1); 这用于将布局附加到活动。 为什么在这里使用它?

看来,您将0传递给Random.nextInt()方法,这是不允许的。

java.lang.IllegalArgumentException: n <= 0: 0
              at java.util.Random.nextInt(Random.java:182)

如果没有到达您的case分支,则会发生这种情况。 如此看来,单选按钮点击的处理方式存在问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM