【问题标题】:Why do the random number crashes my Android app? [closed]为什么随机数会导致我的 Android 应用程序崩溃? [关闭]
【发布时间】:2015-06-09 13:41:26
【问题描述】:

我试图显示一个随机事实并在每次事实发生变化时更改背景颜色。

我在MainActivity 上使用随机数来执行此操作,但只要我按下按钮生成并显示该随机数,应用就会崩溃。

这里是 GitHub 上项目的链接: https://github.com/ishay1999/FunFacts

这是 logCat 中显示的错误:

 06-09 16:36:27.125  14551-14551/com.howtoevery.funfacts E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.howtoevery.funfacts, PID: 14551
    android.content.res.Resources$NotFoundException: String resource ID #0x0
            at android.content.res.Resources.getText(Resources.java:275)
            at android.widget.TextView.setText(TextView.java:4261)
            at com.howtoevery.funfacts.MainActivity$1.onClick(MainActivity.java:56)
            at android.view.View.performClick(View.java:4763)
            at android.view.View$PerformClick.run(View.java:19821)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5274)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

这里是MainActivity.java 代码:

package com.howtoevery.funfacts;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Creating the random
        final Random rand = new Random();


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

        final TextView factLabel;
        final Button showFactButton;

        factLabel = (TextView) findViewById(R.id.fact);
        final ViewGroup backGround = (RelativeLayout) findViewById(R.id.mainBackground);
        showFactButton = (Button) findViewById(R.id.factButton);

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

            int randomNumber;

            @Override
            public void onClick(View view) {
                randomNumber = rand.nextInt(1); // randomNumber will be 0 or 1

                switch (randomNumber) {
                    case 0: { // in case it is 0, show fact number 1 with green color
                        factLabel.setText(R.string.fact1);
                        backGround.setBackgroundColor(getResources().getColor(R.color.android_green));
                        showFactButton.setTextColor(getResources().getColor(R.color.android_green));
                    } break;

                    case 1: { // in case it is 1, show fact number 2 with orange color
                        factLabel.setText(R.string.fact2);
                        backGround.setBackgroundColor(getResources().getColor(R.color.orangish));
                        showFactButton.setTextColor(getResources().getColor(R.color.orangish));
                    } break;
                }

                factLabel.setText(randomNumber); // show the number generated with randomNumber, ONLY FOR DEBUG PURPOSES

            }
        };

        showFactButton.setOnClickListener(myListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

我对应用程序的期望是它会显示不同的事实并更改颜色(现在,为了调试,我希望看到文本更改为生成的随机数并且颜色已更改)

为什么它没有像我预期的那样工作?

【问题讨论】:

  • 根据报错,你引用的是一个不存在的资源,和随机数无关。
  • @lllogiq,什么是不存在的资源? randomNumber 变量确实存在。
  • @IshayFrenkel:资源,不可变。
  • @T.J.Crowder,我不明白,因为 catLog 中提到的MainActivity 中的第 56 行是factLabel.setText(randomNumber);,而且我使用的每个资源也都存在。

标签: java android random


【解决方案1】:

问题出在这一行:factLabel.setText(randomNumber);。您想设置代表您的randmNumber 的字符串。使用

factLabel.setText(String.valueOf(randomNumber)); 

您正在使用的setText 的版本会查找一个字符串,其id 为您提供的int。如果找不到,则会抛出该异常

【讨论】:

  • 谢谢!我不知道我需要把randomNumber 作为一个字符串。 (我会尽快将此标记为答案)有人可以告诉我我做错了什么,以至于我对这个问题投了 4 票吗?
【解决方案2】:

选中您要使用的所有资源 R.color.<something>R.string.<something> 。根据您的异常所在的行号(我认为是 MainActivity.java:56),您可以找到您的应用程序中没有确切存在的资源并转到某个文件(colors.xml、strings.xml 等)并添加它

【讨论】:

  • 这与问题无关。MainActivity 中的第 56 行是 factLabel.setText(randomNumber);,没有任何资源有问题或缺失,但感谢您尝试帮助我 :)
猜你喜欢
  • 2023-04-06
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多