zoukankan      html  css  js  c++  java
  • 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
            最多用三个字节表示一个字符

      未完,待续。

  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/enjoy-coding/p/4799288.html
Copyright © 2011-2022 走看看