尝试写入文本文件时,我的Android Studio应用程序崩溃了

时间:2018-03-30 21:40:53

标签: java android

我正在尝试将ListView中显示的ArrayList的内容写入名为list.txt的文本文件中。

MenuInflaterActivity.java:

package com.course.example.menuinflater;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.net.Uri;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.*;
import java.io.FileWriter;
import java.util.*;

import java.util.*;
import android.speech.tts.TextToSpeech;

public class MenuInflaterActivity extends Activity {

    //Define variabels
    private ArrayList<String> arrayList;
    private ArrayAdapter<String> adapter;
    private EditText textInput;
    String itemClick;
    int itemIndex;

    int counter = 0;

    TextToSpeech tts;

    String data;
    private String file = "mydata";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //hide title and icon in action bar
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);

        //Create list view, array list and adapter
        ListView listView = (ListView) findViewById(R.id.listv);
        String[] items = {};
        arrayList = new ArrayList<> (Arrays.asList(items));
        adapter = new ArrayAdapter<String>(this,R.layout.list_item,R.id.txtitem,arrayList);
        listView.setAdapter(adapter);

        //Create edit text field
        textInput = (EditText) findViewById(R.id.textInput);

        //Assign ItemList as the list view's on click listener
        listView.setOnItemClickListener(new ItemList());

        //Text to Speech
        tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status != TextToSpeech.ERROR) {
                    tts.setLanguage(Locale.US);
                }
            }
        });
    }

    class ItemList implements AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            ViewGroup vg = (ViewGroup) view;
            TextView tv = (TextView) vg.findViewById(R.id.txtitem);
            //Toast.makeText(MenuInflaterActivity.this, tv.getText().toString(),Toast.LENGTH_SHORT).show();

            //itemClick = the item that is clicked
            itemClick = tv.getText().toString();
            //Set the edit text field to display what was clicked
            textInput.setText(itemClick);
            //Get the index of the clicked item - used for update function
            itemIndex = arrayList.indexOf(itemClick);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.add:
                counter++;
                //If there is something entered in the edit text field it will be added to the list, if there is nothing entered nothing will be added
                if (textInput.getText().toString().length() > 0) {
                    String newItem = textInput.getText().toString();
                    arrayList.add(counter + ". " + newItem);
                    adapter.notifyDataSetChanged();
                    tts.speak(newItem + "Has been added to your to-do list.", TextToSpeech.QUEUE_FLUSH, null);
                }

                textInput.getText().clear();

                return true;

            case R.id.delete:
                arrayList.remove(itemClick);
                adapter.notifyDataSetChanged();
                int numberLocation = itemClick.indexOf(".");
                String speechText = itemClick.substring(numberLocation + 2, itemClick.length());
                tts.speak(speechText + "Has been deleted from your to-do list.", TextToSpeech.QUEUE_FLUSH, null);


                textInput.getText().clear();

                return true;

            case R.id.update:
                String updatedItem = textInput.getText().toString();
                arrayList.set(itemIndex, updatedItem);
                adapter.notifyDataSetChanged();

                textInput.getText().clear();

                return true;

            case R.id.save:
                //App crashes when trying to read/write to file
                try {
                    FileWriter writer = new FileWriter("list.txt");
                    for(String str: arrayList) {
                        writer.write(str);
                    }
                    writer.close();
                } catch (Exception e) {}

            case R.id.close:
                try {
                    FileWriter writer = new FileWriter("list.txt");
                    for(String str: arrayList) {
                        writer.write(str);
                    }
                    writer.close();
                } catch (Exception e) {}

                finish();

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.course.example.menuinflater"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk android:minSdkVersion="17" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

单击我的&#34;保存列表&#34;时会出现问题。按钮,应用程序立即关闭,并且不会在Logcat中显示任何类型的错误。

1 个答案:

答案 0 :(得分:3)

  

并且不会在Logcat中显示任何类型的错误。

永远不会捕获异常而无法记录异常,就像在文件I / O中一样:

            try {
                FileWriter writer = new FileWriter("list.txt");
                for(String str: arrayList) {
                    writer.write(str);
                }
                writer.close();
            } catch (Exception e) {}

因此,首先,使用Log.e()将异常记录到LogCat。

接下来,您需要修复FileWriter以写入实际位置。就目前而言,您正在尝试写入list.txt文件,而该文件无处可寻。您的主要选择是internal storageexternal storage

最后,将此磁盘I / O移动到后台线程,以便在I / O正在进行时不会冻结您的UI。

来自This sample app

this book演示了如何写入内部和外部存储。