Android常见问题2:Resources$NotFoundException(1)

  今天上午做一个作业时,偶然出现的一个bug,虽然当时很快修改通过了,但当时由于忙着赶完作业,也没有仔细思考这个bug出现的原因,到晚上终于有时间做了一个小Demo测试一下。

  Demo很简单,需求是:MainActivity界面只有一个按钮,当点击按钮时出现对话框,对话框有输入框,输入框默认是有文本的。

  效果图:

  源码如下:

 1 package com.my.day24_my_testdialog;
 2
 3 import android.os.Bundle;
 4 import android.view.View;
 5 import android.view.View.OnClickListener;
 6 import android.widget.Button;
 7 import android.widget.EditText;
 8 import android.app.Activity;
 9 import android.app.AlertDialog;
10
11 public class MainActivity extends Activity {
12     private Button bt;
13     private AlertDialog dialog;
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18
19         //初始化对话框
20         initDialog();
21
22         bt = (Button) findViewById(R.id.bt);
23
24         bt.setOnClickListener(new OnClickListener() {
25             @Override
26             public void onClick(View v) {
27                 dialog.show();
28             }
29         });
30     }
31
32     private void initDialog() {
33         EditText input = new EditText(this);
34         input.setText("这是默认的文本");
35         input.setSelectAllOnFocus(true);
36
37         dialog = new AlertDialog.Builder(this)
38                     .setIcon(android.R.drawable.ic_dialog_info)
39                     .setTitle("信息编辑框")
40                     .setView(input)
41                     .setCancelable(false)
42                     .setPositiveButton("确定", null)
43                     .setNegativeButton("取消", null)
44                     .create();
45     }
46
47 }

  

  当修改第34行代码:将其改为类似input.setText(23)的代码时,编译没问题,运行直接崩溃,查看日志出现如下提示:

提取关键信息:

出现Resource$NotFoundException问题。

  当时想法是虽然知道setText()这个方法传入一个字符串就可以了,但是为了图简单,自以为如果自己传入一个整型数,系统应该会自动帮助将其转化为字符串,但是事实是这里系统不会对这个整型数做出任何改变,解决办法很简单,直接在后面加上空串,即setText(23+"")就OK了。

  这里实质是:setText()有几个重载的方法

  可以看见其中一个方法为setText(int resid),这里参数正好是一个整型数,当我向这个方法传入一个整型数时,默认调用这个方法,而这个Id应该是一个资源id,而R资源文件不存在某个资源对应的这个id,所以提示Resource$NotFoundException信息。

  仔细看第一个方法,其参数类型为CharSequence。

  这个类型在Java的方法中作为参数很常见,我们一般默认把一个字符串作为这个类型的参数传入。

  

  CharSequence本质是一个什么东西?

  查阅jdk文档,其定义是:

可以知道它是一个接口,它的实现类有CharBuffer,Segment,String,StringBuffer,StringBuilder,其中后面三个类我们很熟悉,都是关于字符序列的。

  

  文档对这个接口的描述:

  CharSequence接口的方法定义:

  

  String类定义:

 

  StringBufferl类定义:

  StringBuilder类定义:

  String,StringBuffer,StringBuilder类都定义为了final,且它们都实现了CharSequence接口。

  综上看来:CharSequence接口对许多不同种类的char序列提供统一的只读访问,也就是将CharSequence作为参数的类型,能够处理更多种情景,它不仅可以接收String类型的参数,也可以接收StringBuilder和StringBuffer类型的参数,这样做可以认为是简单的接口回调(即将实现某一接口的对象的引用付给这个接口变量)。

  扩展:还有一个与CharSequence类似的比较经常见到的类叫做Charset,表示编码的类型,是一个字符串,可以取值为”utf-8","gb2312"等。

     Charset类常在字符串的相关方法见到:

     1.  通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

     2.  使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

      方法一:常用于得到了一个字符串的字节数组,这个原来的字符串包含中文,这时如果要想将字节数组还原为字符串,必须指定字符集为"utf-8",否则将字节数组转化为字符串会出现乱码。

      方法二:将一个字符串以指定的编码方式转化为字节数组。

  补充:常见的编码

     1 ASCII码
        美国标准信息交换码,用一个字节的7位表示
     2 ISO8859-1
        拉丁码表,用一个字节的8位表示
       3 GB2312
        中文编码
     4 GBK
        中文编码表的升级,融合了更多的字符。
     5 Unicode:
        国际标准码,所有文字都用两个字节表示
       6 UTF-8
        最多用三个字节表示一个字符

  未完,待续。

时间: 2024-11-03 15:24:22

Android常见问题2:Resources$NotFoundException(1)的相关文章

android.content.res.Resources$NotFoundException

今天在项目中遇到异常android.content.res.Resources$NotFoundException: String resource ID #0x42 对应报错的程序中的代码行是这样的: holder.groupTextView.setText(city.getPy().toUpperCase().charAt(0)); 开始以为是资源id弄错了,检查了一遍,发现没有问题: 接着又顺着是不是组成TextView的资源是否缺失这个方向去查找问题,还是没找到原因: 最后google了

android.content.res.Resources$NotFoundException:String resource ID #ffffffff

无语,搞了半天,只能去插这个错误代号,结果就找到了这个结果. scoreTextView.setText(score+""); 这个一定要自己手动转换..不科学啊..关键是在eclipse里的提示错误让人以为是id写错了什么的. 以下是别人的一片文章: http://www.blogjava.net/anchor110/articles/355670.html 今天跑程序的时候,出现这样的错误: android.content.res.Resources$NotFoundExcepti

bug android.content.res.Resources$NotFoundException: String resource ID #0x0

android.content.res.Resources$NotFoundException: String resource ID #0x0 找不到资源文件ID #0x0 原因分析如下: 遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所以就会报出这个bug. 将int型业务数据,转换成String类型即可.

Android 常见问题收集 (持续更新)

gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, parent.getWidth()/2+DpPx.dip2px(context,20));//-20 10spacing 5padding + 40 textview.height

android.content.res.Resources$NotFoundException: String resource ID #0x11

在练习数据绑定时,出现以下错误 FATAL EXCEPTION: main                                                                               Process: com.vogella.android.databinding, PID: 8332                                                                               andr

【BUG】android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi/toolbar_line.png from

SafeGod在coolpad(4.0)上执行.登陆进去的设备列表界面遇到的问题.三星和索尼没有这个问题. 06-24 15:23:06.897: E/AndroidRuntime(12655): FATAL EXCEPTION: main 06-24 15:23:06.897: E/AndroidRuntime(12655): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jason.safeGod

异常处理android.content.res.Resources$NotFoundException: String resource ID #0x44

错误:android.content.res.Resources$NotFoundException: String resource ID #0x1 原因:一般发生在参数 int resId 错误,你把String赋值给int的resId,所以编译器找不到正确的resource于是报错. 最简单的例子,检查一下你的Toast.makeText()啊textView.setText啊之类的函数,这种函数通常有几个重载,如: textView.setText(CharSequence text);

android.content.res.Resources$NotFoundException: String resource ID #0x1

之前忘了记录这个错误,今天又遇到了.唉,人不能纵容自己犯懒,遂记录之. 错误:android.content.res.Resources$NotFoundException: String resource ID #0x1 原因:一般发生在参数 int resId 错误,你把String赋值给int的resId,所以编译器找不到正确的resource于是报错. 最简单的例子,检查一下你的Toast.makeText()啊textView.setText啊之类的函数,这种函数通常有几个重载,如:

Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f070058 android-studio 3.0 from canary 5 to canary 6

我升级android-studio到了3.0 canary 6打包编译安装出现如下错误: 07-11 13:00:39.523 8913-8913/dcpl.com.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: dcpl.com.myapplication, PID: 8913 java.lang.RuntimeException: Unable to start activity ComponentInfo{dcp