Android常見問題2:Resources$NotFoundException(1)

來源:互聯網
上載者:User

標籤:

  今天上午做一個作業時,偶然出現的一個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     @Override15     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             @Override26             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
        最多用三個位元組表示一個字元

 

  未完,待續。

 

Android常見問題2:Resources$NotFoundException(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.