利用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,只要程式解檔出來格式和文字檔一樣,中文字就不會出現亂碼。



這位高手你好!!我想問一個問題是:
回覆刪除如何製作連棟式下拉選單!
如果第一層選單為A:茶類 ,B:果汁類
下一層選單會因上層而改變下一層選單,
上層選單如是A:茶類,下一層選單則是 A_1:綠茶,A_2:紅茶,..等等
謝謝!!
請參考:http://jim690701.blogspot.tw/2012/07/androidspinner_15.html
刪除謝謝!!
刪除我發現版主寫得很簡明扼要!!
你好,請問抓到文字檔內容算是儲存在資料庫嗎?
回覆刪除不是,是存在陣列內
刪除看了好多書及網站還是大大您的最清楚一目了然
回覆刪除請問這個可以修改成讀取雲端內的txt檔嗎
應該是可以的
刪除我有試過取得遠端站台上的xml檔下來解析使用
所以基本上txt檔應該也是沒問題的才對
因初學者...
刪除所以有相關的網頁可以提供嗎?
如您的範例可讓我們學習
依照上述方式執行, 一直出現錯誤
回覆刪除請問可以提供檔案嗎?