Android开发笔记(二)-----------------文本阅读

先来看一下manifest文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bq.textreader"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ListAllFileActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <activity
            android:name="com.bq.textreader.ViewFile"
            android:label="@string/app_name" >
           
        </activity>
    </application>

</manifest>

在这里我们添加了两个Activity,下面对其布局

1.ListAllFileActivity的布局,比较简单,只有一个ListView

<?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" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />

</LinearLayout>

2.ListAllFileActivity的实现,主要有获得文件列表的方法,并启动一个新的Activity

package com.bq.textreader;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/*展现全部文件的Activity*/
public class ListAllFileActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFileList();
    }

    private void initFileList() {
        File path = android.os.Environment.getExternalStorageDirectory();
        File[] f = path.listFiles();
        fill(f);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = this.getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        menu.removeItem(R.id.gb2312);
        menu.removeItem(R.id.utf8);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.about:
            doAbout();
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

    // 弹出关于框
    private void doAbout() {
        Dialog dialog = new AlertDialog.Builder(ListAllFileActivity.this)
                .setTitle(R.string.aboutTitle)
                .setMessage(R.string.aboutInfo)
                .setPositiveButton(R.string.aboutOK,
                        new DialogInterface.OnClickListener() {
                            public void onClick(
                                    DialogInterface dialoginterface, int i) {
                                // 按钮事件
                            }
                        }).create();
        dialog.show();
    }
    
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Intent intent = new Intent(ListAllFileActivity.this, ViewFile.class);
        bundle = new Bundle();
        File file = fileNameList.get(position);
        if (file.isDirectory()) {
            File[] f = file.listFiles();
            fill(f);
        } else {
            bundle.putString(fileNameKey, file.getAbsolutePath());
            intent.putExtras(bundle);
            startActivityForResult(intent, 0);
        }
    }

    // 读取文件列表,并设置listview
    private void fill(File[] files) {
        fileNameList = new ArrayList<File>();
        for (File file : files) {
            if (isValidFileOrDir(file)) {
                fileNameList.add(file);
            }
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, fileToStrArr(fileNameList));
        setListAdapter(adapter);
    }

    /* 检查是否为合法的文件名,或者是否为路径 */
    private boolean isValidFileOrDir(File file) {
        if (file.isDirectory()) {
            return true;
        } else {
            String fileName = file.getName().toLowerCase();
            if (fileName.endsWith(".txt")) {
                return true;
            }
        }
        return false;
    }

    private String[] fileToStrArr(List<File> fl) {
        ArrayList<String> fnList = new ArrayList<String>();
        for (int i = 0; i < fl.size(); i++) {
            String nameString = fl.get(i).getName();
            fnList.add(nameString);
        }
        return fnList.toArray(new String[0]);
    }

    /* 文件列表 */
    private List<File> fileNameList;
    private Bundle bundle;
    private String fileNameKey = "fileName";

}

3.ViewFile的布局文件

<?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" >

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <TextView
            android:id="@+id/view_contents"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:textSize="20sp" >
        </TextView>
    </ScrollView>

</LinearLayout>

4.ViewFile的实现,用一个TextView显示文本

package com.bq.textreader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

/**
 * 打开文件的方法
 * @author Administrator
 *
 */
public class ViewFile extends Activity {
    
    private String filenameString;
    private static final String gb2312 = "GB2312";
    private static final String utf8 = "UTF-8";
    private static final String defaultCode = gb2312;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.filebrowser);
        this.registerForContextMenu(findViewById(R.id.view_contents));
        try {
            Bundle bunde = this.getIntent().getExtras();
            filenameString = bunde.getString("fileName");
            refreshGUI(defaultCode);
        } catch (Exception e) {
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = this.getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo){
        if(v==findViewById(R.id.view_contents)){
        menu.add(0,1,0,R.string.largeSize);
        menu.add(0,2,0,R.string.Size);
        menu.add(0,3,0,R.string.smallSize);        
        }
        }
    @Override
    public boolean onContextItemSelected(MenuItem menuItem){
        switch(menuItem.getItemId()){
        case 1:
            ((TextView) findViewById(R.id.view_contents)).setTextSize(27.0f);
            break;
        case 2:
            ((TextView) findViewById(R.id.view_contents)).setTextSize(19.0f);
            break;
        case 3:
            ((TextView) findViewById(R.id.view_contents)).setTextSize(10.0f);
            break;        
        
        }
        return true;
        
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.gb2312:
            refreshGUI(defaultCode);
            break;
        case R.id.utf8:
            refreshGUI(utf8);
            break;
        case R.id.about:
            doAbout();
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }
    
    //弹出关于框
    private void doAbout() {
        Dialog dialog = new AlertDialog.Builder(ViewFile.this).setTitle(
                R.string.aboutTitle).setMessage(R.string.aboutInfo)
                .setPositiveButton(R.string.aboutOK,
                        new DialogInterface.OnClickListener() {
                            public void onClick(
                                    DialogInterface dialoginterface, int i) {
                                // 按钮事件
                            }
                        }).create();
        dialog.show();
    }

    private void refreshGUI(String code)
    {    TextView tv = (TextView) findViewById(R.id.view_contents);
        String fileContent = getStringFromFile(code);
        tv.setText(fileContent);
    }
    
    public String getStringFromFile(String code)
    {
        try {
            StringBuffer sBuffer = new StringBuffer();
            FileInputStream fInputStream = new FileInputStream(filenameString);
            InputStreamReader inputStreamReader = new InputStreamReader(fInputStream, code);
            BufferedReader in = new BufferedReader(inputStreamReader);
            if(!new File(filenameString).exists())
            {
                return null;
            }
            while (in.ready()) {
                sBuffer.append(in.readLine() + "\n");
            }
            in.close();
            return sBuffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    
    // 读取文件内容
    public byte[] readFile(String fileName) throws Exception {
        byte[] result = null;
        FileInputStream fis = null;
        try {
            File file = new File(fileName);
            fis = new FileInputStream(file);
            result = new byte[fis.available()];
            fis.read(result);
        } catch (Exception e) {
        } finally {
            fis.close();
        }
        return result;
    }

}

5.用到一个menu资源文件

<?xml version="1.0" encoding="UTF-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/utf8" android:title="@string/code_utf8"
        android:icon="@android:drawable/ic_menu_edit" />
    <item android:id="@+id/gb2312" android:title="@string/code_gb2312"
        android:icon="@android:drawable/ic_menu_edit" />
    <item android:id="@+id/about" android:title="@string/about"
        android:icon="@android:drawable/ic_menu_info_details" />
</menu>

6.strings.xml就不写了,没必要

posted @ 2012-12-22 23:36  强子~Developer  阅读(261)  评论(0)    收藏  举报