簡體   English   中英

在一個活動中寫入文本文件,在另一個活動中讀取ListView?

[英]Write to a text file in one activity and read into ListView in another?

因此,我對Android Studio還是比較陌生。 我正在研究小型QR碼掃描儀。 基本上,我想做的是將任何QR碼結果添加到文本文件中,然后能夠將該文本文件加載到另一個活動中。

我已經向AndroidManifest.xml添加了必要的權限

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

這是MainActivity.java

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.camera2.CameraManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.google.zxing.Result;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import me.dm7.barcodescanner.zxing.ZXingScannerView;

public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
    private ZXingScannerView mScannerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mScannerView = new ZXingScannerView(this);   // Programmatically initialize the scanner view
        setContentView(mScannerView);

        mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
        mScannerView.startCamera();         // Start camera
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        int selectedId = item.getItemId();

        switch (selectedId)
        {
            case R.id.mniHistory:
                startActivity(new Intent(MainActivity.this, ResultsActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    @Override
    public void onPause() {
        super.onPause();
        mScannerView.stopCamera();           // Stop camera on pause
    }

    @Override
    public void handleResult(final Result rawResult) {
        // Do something with the result here

        Log.e("handler", rawResult.getText()); // Prints scan results
        Log.e("handler", rawResult.getBarcodeFormat().toString()); // Prints the scan format (qrcode)

        // Alert Box (the one that asks if you want to send)
        AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
        builder1.setTitle("Scan Result");
        builder1.setMessage(rawResult.getText() + "\n" + "Would you like to send this?");
        builder1.setCancelable(true);

        builder1.setPositiveButton(
                "Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        // ADD SCAN TO TEXT FILE
                        try {
                            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("History.txt", Context.MODE_PRIVATE));
                            outputStreamWriter.write(rawResult.getText());
                            outputStreamWriter.close();
                        } catch (IOException e) {
                            Log.e("Exception", "File write failed: " + e.toString());
                        }
                        // DONE ADDING TO HISTORY
                        dialog.cancel();
                    }
                });

        builder1.setNegativeButton(
                "No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                        mScannerView.resumeCameraPreview(MainActivity.this);
                    }
                });

        AlertDialog alert11 = builder1.create();
        alert11.show();
    }
}

由於某種原因該文件未寫入。 它不會出現在手機的存儲器中。 無論如何,這是ResultsActivity.java

ResultsActivity.java(旨在顯示掃描歷史記錄)

import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class ResultsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_results);
        ArrayList<String> completeList = new ArrayList<String>();

        ListView listView1;

        listView1 = (ListView) findViewById(R.id.ResultsListView);

        try {
            String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/History.txt";
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252"), 100);

            String line;
            // ArrayList<String> lines = new ArrayList<String>();
            while ((line = br.readLine()) != null) {
                completeList.add(line);
            }

            br.close();

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, completeList);


            listView1.setAdapter(adapter);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

順便說一句,我是否將文本文件正確讀入ListView? 就是想。

但是無論如何,我的主要問題是寫入內部存儲,但這似乎沒有用。 有什么想法嗎?

首先,您不應該使用這種方法-在組件之間共享簡單的字符串,您可以使用許多內存事物,例如意圖,服務,廣播等。 至少使用SharedPreferences更簡單。

關於您的問題,錯誤在於以下兩行代碼片段:

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("History.txt", Context.MODE_PRIVATE));

在這一行,您正在打開流以將數據寫入私有文件(此類文件存儲在內部應用程序文件夾中)。

String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/History.txt";

在這里,您嘗試在外部存儲中查找文件(只是一個不同的文件夾)

因此,要查找文件,可以使用相應的方法openFileInput

希望會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM