利用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檔應該也是沒問題的才對
因初學者...
刪除所以有相關的網頁可以提供嗎?
如您的範例可讓我們學習
依照上述方式執行, 一直出現錯誤
回覆刪除請問可以提供檔案嗎?