2012-07-10

Android下拉選單(spinner)應用(二) - 使用I/O讀取TXT文字檔

接續上節的應用,這一章節我們來做點變形

利用I/O讀取SD卡底下的TXT文字檔(output.txt)

[output.txt文字檔內容]
A,3,6,5
B,2,5,6
C,2,3,7
D,5,6,8
E,6,7,10

邏輯說明:
                    讀取TXT文字檔內容,下拉選單只寫入英文字ABCDE

下拉選單改變時,把後面的數字分別寫到三個文字欄位

程式碼:

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >


        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/txt1"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" >

            <requestFocus />
        </EditText>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >


        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/txt2"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/editText2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >


        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/txt3"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/editText3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10" />

    </LinearLayout>

</LinearLayout>


string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, ReadtxtActivity!</string>
    <string name="app_name">Readtxt</string>
    <string name="txt1">TextBox1</string>
    <string name="txt2">TextBox2</string>
    <string name="txt3">TextBox3</string>

</resources>

ReadtxtActivity
package jim.readtxt;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

public class ReadtxtActivity extends Activity {
  private Spinner spinner;  
  private ArrayAdapter<String> adapter; 
  private EditText TextBox1,TextBox2,TextBox3;
  public String[] strSpinner;
  public String[] strText1;
  public String[] strText2;
  public String[] strText3;
  
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        try{
            //建立FileReader物件,並設定讀取的檔案為SD卡中的output.txt檔案
            FileReader fr = new FileReader("/sdcard/output.txt");
            //將BufferedReader與FileReader做連結
            BufferedReader br = new BufferedReader(fr);
            List<String> data  = new ArrayList<String>();//先把資料存到arraylist中
            
            String line ="";
            while((line = br.readLine()) != null) {
                data.add(line);
            }
            strSpinner = new String[data.size()];
            strText1 = new String[data.size()];
            strText2 = new String[data.size()];
            strText3 = new String[data.size()];
            
            strSpinner= (String[]) data.toArray(new String[data.size()]);
            String[] strArray = (String[]) data.toArray(new String[data.size()]);
            
          
            //Iterator<String> it = data.iterator();
            for(int i=0; i < strArray.length; i++) {
             
             strSpinner[i] = strArray[i].split(",")[0]; 
             strText1[i] = strArray[i].split(",")[1]; 
             strText2[i] = strArray[i].split(",")[2]; 
                strText3[i] = strArray[i].split(",")[3]; 
            }
            
            TextBox1 = (EditText) findViewById(R.id.editText1);  
            TextBox2 = (EditText) findViewById(R.id.editText2);  
            TextBox3 = (EditText) findViewById(R.id.editText3); 
            
            spinner = (Spinner) findViewById(R.id.spinner1); 
            
            //將可選内容與ArrayAdapter連接起來  
            adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,strSpinner);  
              
            //設置下拉列表的風格  
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
              
          //将adapter 添加到spinner中  
            spinner.setAdapter(adapter);  
              
            //添加事件下拉選單Spinner監聽事件
            spinner.setOnItemSelectedListener(new SpinnerSelectedListener());  
                          
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
  //使用數组形式操作  
    class SpinnerSelectedListener implements OnItemSelectedListener{  
  
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,  
                long arg3) {  
         TextBox1.setText(strText1[arg2]);  
         TextBox2.setText(strText2[arg2]); 
         TextBox3.setText(strText3[arg2]); 
         
        }  
  
        public void onNothingSelected(AdapterView<?> arg0) {  
        }  
    }                
}

執行後畫面



後記:

這就是使用I/O把TXT檔案讀取進來後的應用,此章節主要是有添加

下拉選單Spinner監聽事件SpinnerSelectedListener,由 SpinnerSelectedListener

去監聽 Spinner是否有變更過,而修改EditText的內容。



讀取txt檔中文字解法:
把下面這個:
FileReader fr = new FileReader("/sdcard/output.txt");
BufferedReader br = new BufferedReader(fr);

換成下面這個:
InputStreamReader isr = new InputStreamReader(new FileInputStream("/sdcard/test.txt"), "Big5");  
BufferedReader br = new BufferedReader(isr);  

說明:
txt文字檔儲存格式預設是ANSI
程式內解檔出來預設是UTF-8,所以只要把解檔出來換成是繁體中文bit5就可以了
簡體中文是GB2312,只要程式解檔出來格式和文字檔一樣,中文字就不會出現亂碼。

9 則留言:

  1. 這位高手你好!!我想問一個問題是:
    如何製作連棟式下拉選單!
    如果第一層選單為A:茶類 ,B:果汁類
    下一層選單會因上層而改變下一層選單,
    上層選單如是A:茶類,下一層選單則是 A_1:綠茶,A_2:紅茶,..等等
    謝謝!!

    回覆刪除
    回覆
    1. 請參考:http://jim690701.blogspot.tw/2012/07/androidspinner_15.html

      刪除
    2. 謝謝!!
      我發現版主寫得很簡明扼要!!

      刪除
  2. 你好,請問抓到文字檔內容算是儲存在資料庫嗎?

    回覆刪除
  3. 看了好多書及網站還是大大您的最清楚一目了然
    請問這個可以修改成讀取雲端內的txt檔嗎

    回覆刪除
    回覆
    1. 應該是可以的

      我有試過取得遠端站台上的xml檔下來解析使用

      所以基本上txt檔應該也是沒問題的才對

      刪除
    2. 因初學者...
      所以有相關的網頁可以提供嗎?
      如您的範例可讓我們學習

      刪除
  4. 依照上述方式執行, 一直出現錯誤
    請問可以提供檔案嗎?

    回覆刪除

您的寶貴建議是我前進的動力!