[英]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.