Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';我的声明是否有效?_Java_Android_Android Drawable - Fatal编程技术网

Java 为什么';我的声明是否有效?

Java 为什么';我的声明是否有效?,java,android,android-drawable,Java,Android,Android Drawable,我在Android Studio中制作了一个应用程序 快速总结:这是一款适用于儿童的应用程序,当用户启动游戏时,它会呈现一个随机形状。用户有4个选项可供选择,其中一个形状是正确的形状。然后,用户需要将形状拖放到轮廓中。下面显示了一个示例的图片 问题是,我需要下面4个形状中的1个来匹配要猜测的形状。我有两套共18个形状,第一套是形状轮廓带?里面 int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1,

我在Android Studio中制作了一个应用程序

快速总结:这是一款适用于儿童的应用程序,当用户启动游戏时,它会呈现一个随机形状。用户有4个选项可供选择,其中一个形状是正确的形状。然后,用户需要将形状拖放到轮廓中。下面显示了一个示例的图片

问题是,我需要下面4个形状中的1个来匹配要猜测的形状。我有两套共18个形状,第一套是形状轮廓带?里面

    int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1, R.drawable.outline_2,
            R.drawable.outline_3, R.drawable.outline_4, R.drawable.outline_5, R.drawable.outline_6,
            R.drawable.outline_7, R.drawable.outline_8, R.drawable.outline_9, R.drawable.outline_10,
            R.drawable.outline_11, R.drawable.outline_12, R.drawable.outline_13, R.drawable.outline_14,
            R.drawable.outline_15, R.drawable.outline_16,R.drawable.outline_17};
第二组是带有面的实际彩色形状

    int[] images = new int[] {R.drawable.img_0, R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
    R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, R.drawable.img_8, R.drawable.img_9, R.drawable.img_10,
            R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16,
            R.drawable.img_17};
我需要某种函数或语句,其中底部的4个形状不能与需要猜测的形状对应的1个形状相同

注:轮廓_0形状对应于img_0,轮廓_1对应于img_1等

这是此活动的全部代码

public class SecondActivity extends AppCompatActivity {

int n;
ImageView shape1, shape2, shape3, shape4, guessShape;
ImageButton exit;
Random rand = new Random();
ImageView[] shapes = new ImageView[4];


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

    shape1 = (ImageView) findViewById(R.id.shape1);
    shape2 = (ImageView) findViewById(R.id.shape2);
    shape3 = (ImageView) findViewById(R.id.shape3);
    shape4 = (ImageView) findViewById(R.id.shape4);
    guessShape = (ImageView) findViewById(R.id.guessShape);
    shapes[0] = shape1;
    shapes[1] = shape2;
    shapes[2] = shape3;
    shapes[3] = shape4;

    //store all the shapes in an array
    int[] images = new int[] {R.drawable.img_0, R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
    R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, R.drawable.img_8, R.drawable.img_9, R.drawable.img_10,
            R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16,
            R.drawable.img_17};

    int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1, R.drawable.outline_2,
            R.drawable.outline_3, R.drawable.outline_4, R.drawable.outline_5, R.drawable.outline_6,
            R.drawable.outline_7, R.drawable.outline_8, R.drawable.outline_9, R.drawable.outline_10,
            R.drawable.outline_11, R.drawable.outline_12, R.drawable.outline_13, R.drawable.outline_14,
            R.drawable.outline_15, R.drawable.outline_16,R.drawable.outline_17};

    //generate random number between 0 and image.length
   int img1 = (int) Math.round((Math.random() * images.length));
    int img2 = (int) Math.round((Math.random() * images.length));
    int img3 = (int) Math.round((Math.random() * images.length));
    int img4 = (int) Math.round((Math.random() * images.length));
    int outlineID = (int) Math.round((Math.random() * outlines.length));


    //set the image
    guessShape.setBackgroundResource(outlines[outlineID]);
    shape1.setBackgroundResource(images[img1]);
    shape2.setBackgroundResource(images[img2]);
    shape3.setBackgroundResource(images[img3]);
    shape4.setBackgroundResource(images[img4]);

      //set tags for the imageViews
    guessShape.setTag("RandomImage");
    shape1.setTag("Shape1");
    shape2.setTag("Shape2");
    shape3.setTag("Shape3");
    shape4.setTag("Shape4");

    //1 of the 4 image views needs to match outline of the shape that needs to be guessed
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_0)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_0);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_1)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_1);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_2)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_2);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_3)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_3);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_4)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_4);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_5)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_5);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_6)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_6);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_7)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_7);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_8)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_8);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_9)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_9);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_10)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_10);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_11)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_11);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_12)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_12);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_13)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_13);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_14)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_14);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_15)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_15);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_16)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_16);
    }
    if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_17)){
        int random = new Random().nextInt(shapes.length);
        shapes[random].setBackgroundResource(R.drawable.img_17);
    }
}
}

  • 我做错了什么
  • 为什么我的if语句不能确保下面的一个随机形状对应于要猜测的形状
  • 如何确保底部的4个形状不同

  • 任何解决我问题的建议都会很好。谢谢!:)

    如果没有日志、stacktrace或输出,就很难准确地知道哪里出错了。有几件事你可以做,要么修复这个错误,要么防止另一个错误

    设置变量

    让我们将guessShape.getBackground().getConstantState()保存为变量。现在我不知道这是什么类型,所以我现在就叫它对象。请使用正确的类型更新

    Object currentBackground = guessShape.getBackground().getConstantState();
    
    If-Else-If

    目前,您正在使用if语句,后面跟着更多if语句。这具有每次测试第一个if比第二个if比第三个if的效果。相反,我们只想将每一个匹配一次。这是一本书

    让我们改变这一点:

    if(currentBackground.equals(R.drawable.outline_0){
        ...
    }
    if(currentBackgorund.equals(R.drawable.outline_1){
        ...
    } .... 
    
    为此:

    if(currentBackground.equals(R.drawable.outline_0){
        ...
    } else if(currentBackgorund.equals(R.drawable.outline_1){
        ...
    } .... 
    
    其他

    现在我们知道它只会匹配一次,我们希望确保找到它。我们希望在刚刚完成的
    if-else-if
    语句末尾捕获一个
    else

    .... } else if (currentBackground.equals(R.drawable.outline_17){
           ... 
    } else {
         // How do you want to handle if the background did not equal any of your images? 
    }
    
    调试

    现在我们有了一些主要的改进。你需要找出哪里出了问题。一种有用的方法是将内容打印到控制台。在IDE中有更酷、更强大的调试方法,比如NetBeans或Eclipse,但是现在,
    System.out.println
    非常好

    诀窍在于知道你可能会错在哪里。我看到了几个“失败点”。这些是你有更高的出错风险的领域。这将有助于检查该值是否与您当时认为的值相同

    看看你的随机数。弄清楚数字是什么。它们是否在正确的范围内?这也将帮助您调试它应该是哪个形状

      //generate random number between 0 and image.length
    int img1 = (int) Math.round((Math.random() * images.length));
    int img2 = (int) Math.round((Math.random() * images.length));
    int img3 = (int) Math.round((Math.random() * images.length));
    int img4 = (int) Math.round((Math.random() * images.length));
    int outlineID = (int) Math.round((Math.random() * outlines.length));
    
    // Print these to know what they are, especially outlineID. 
    
    您可以在每个if语句中输入指纹,以查看哪个(包括else)被捕获以及为什么被捕获。你可以确定它是你想要的

    结论

    试试看。它可能不会捕捉到你的bug,但至少你会有一个具体的想法,知道你将它设置为什么,如果它捕捉到了什么。这将帮助您彻底调试。如果大纲每次都进入正确的If语句,那么我们就知道If语句中存在问题!调试可能不会在第一次发现问题,但它确实缩小了问题的范围

    非匹配图像应答 我正在编辑我的答案以包括这一点。我很确定我发现了你的问题

    在您的代码中:

    //generate random number between 0 and image.length
    int img1 = (int) Math.round((Math.random() * images.length));
    int img2 = (int) Math.round((Math.random() * images.length));
    int img3 = (int) Math.round((Math.random() * images.length));
    int img4 = (int) Math.round((Math.random() * images.length));
    int outlineID = (int) Math.round((Math.random() * outlines.length));
    
    您正在为图像创建4个随机图像,但随后您也正在为轮廓创建一个随机图像。这意味着您可以获得图像1、2、3、4,但随后在轮廓上获得图像17的轮廓!这将匹配您的if语句,但它将为您提供17的图像,而不是您想要的图像

    在本例中,您希望获得4个随机数,然后从这些随机数中选择您的大纲。这里有一种方法可以做到这一点(注意:有更好/更简单的方法,但我想确保它处于您当前的水平。您很快就会到达那里!)

    这会给你一个随机数1-4。然后,您可以使用将正确的图像保存到whichImg。然后使用它在大纲数组中获得相同的数字

    旁注
    您可能还没有学会它们,但是使用
    for循环
    将是一种很好的方法,可以将您的代码从所有这些if语句降到一个。:)如果您不熟悉它们,请在尝试之前先修复错误。是指向教程的链接,以防您想查看它

    如果没有日志、stacktrace或输出,就很难准确地知道哪里出错了。有几件事你可以做,要么修复这个错误,要么防止另一个错误

    设置变量

    让我们将guessShape.getBackground().getConstantState()保存为变量。现在我不知道这是什么类型,所以我现在就叫它对象。请使用正确的类型更新

    Object currentBackground = guessShape.getBackground().getConstantState();
    
    If-Else-If

    目前,您正在使用if语句,后面跟着更多if语句。这具有每次测试第一个if比第二个if比第三个if的效果。相反,我们只想将每一个匹配一次。这是一本书

    让我们改变这一点:

    if(currentBackground.equals(R.drawable.outline_0){
        ...
    }
    if(currentBackgorund.equals(R.drawable.outline_1){
        ...
    } .... 
    
    为此:

    if(currentBackground.equals(R.drawable.outline_0){
        ...
    } else if(currentBackgorund.equals(R.drawable.outline_1){
        ...
    } .... 
    
    其他

    现在我们知道它只会匹配一次,我们希望确保找到它。我们希望在刚刚完成的
    if-else-if
    语句末尾捕获一个
    else

    .... } else if (currentBackground.equals(R.drawable.outline_17){
           ... 
    } else {
         // How do you want to handle if the background did not equal any of your images? 
    }
    
    调试

    现在我们有了一些主要的改进。你需要找出哪里出了问题。一种有用的方法是将内容打印到控制台。还有更强大的调试方法