• 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
            最多用三个字节表示一个字符

      未完,待续。

  • 相关阅读:
    shell & awk 变量传递
    ubuntu下SVN服务器安装配置
    zabbix客户端配置
    python操作Excel读写--使用xlrd
    Zabbix Agent-Windows平台配置指导
    centos6.5下Zabbix系列之Zabbix安装搭建及汉化
    Centos 下安装Zabbix Linux 客户端
    zabbix监控mysql主从复制
    Zabbix利用msmtp+mutt发送邮件报警
    vue props传数组爬坑
  • 原文地址:https://www.cnblogs.com/enjoy-coding/p/4799288.html
Copyright © 2020-2023  润新知