0

5 つの EditText 入力を記録してファイルに保存する Android アプリを作成しています。私が知る必要があるのは、各ファイルを個別に取得し、結果を別の EditText フィールドに出力する方法です。

私の例コード:

package chuck.com;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
import android.content.Intent;

public class FillFile extends Activity {

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





    Button submit = (Button) findViewById(R.id.button1);
    submit.setOnClickListener(sub);
    Button disp = (Button) findViewById(R.id.button2);
    disp.setOnClickListener(dis);
}
private OnClickListener sub = new OnClickListener(){
    public void onClick(View v){

        try {
            EditText one = (EditText) findViewById(R.id.editText1);
            EditText two = (EditText) findViewById(R.id.editText2);
            EditText three = (EditText) findViewById(R.id.editText3);
            EditText four = (EditText) findViewById(R.id.editText4);
            EditText five = (EditText) findViewById(R.id.editText5);

            FileOutputStream fos;
            fos = openFileOutput("XML.txt", MODE_APPEND);

            String uno = one.getText().toString();
            String dos = two.getText().toString();
            String tres = three.getText().toString();
            String quatro = four.getText().toString();
            String cinco = five.getText().toString();

            fos.write(uno.getBytes());
            fos.write(dos.getBytes());
            fos.write(tres.getBytes());
            fos.write(quatro.getBytes());
            fos.write(cinco.getBytes());

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
};
private OnClickListener dis = new OnClickListener(){
    public void onClick(View v){
        Intent transf = new Intent(v.getContext(), MainActivity.class);
        startActivityForResult(transf, 0);
    }
};
}

ファイルをエクスポートしたいxmlレイアウト:

 package chuck.com;

 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;

 import android.os.Bundle;
 import android.app.Activity;
 import android.content.Intent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;

 public class MainActivity extends Activity {

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

    File fileDir = getFilesDir();
    String fileName = ("XML.txt");
    File backup = new File(fileDir, fileName);
    boolean content = backup.length() == 0;

    try {
        backup.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    TextView one = (TextView) findViewById(R.id.textView1);
    TextView two = (TextView) findViewById(R.id.textView2);
    TextView three = (TextView) findViewById(R.id.textView3);
    TextView four = (TextView) findViewById(R.id.textView4);
    TextView five = (TextView) findViewById(R.id.textView5);

    EditText eOne = (EditText) findViewById(R.id.editText1);
    EditText eTwo = (EditText) findViewById(R.id.editText2);
    EditText eThree = (EditText) findViewById(R.id.editText3);
    EditText eFour = (EditText) findViewById(R.id.editText4);

    Button input = (Button) findViewById(R.id.input_button);
    input.setOnClickListener(insert);
    if (content)
    {
        one.setVisibility(View.GONE);
        two.setVisibility(View.GONE);
        three.setVisibility(View.GONE);
        four.setVisibility(View.GONE);

        eOne.setVisibility(View.GONE);
        eTwo.setVisibility(View.GONE);
        eThree.setVisibility(View.GONE);
        eFour.setVisibility(View.GONE);
    }
    else
    {
        five.setVisibility(View.GONE);

        FileInputStream fis;
        fis = openFileInput("XML.txt");

        eOne.setText(uno);
        eTwo.setText(dos);
        eThree.setText(tres);
        eFour.setText(quatro, cinco);
    }
  }
  private OnClickListener insert = new OnClickListener(){
    public void onClick(View v) { 
        Intent trans = new Intent(v.getContext(), FillFile.class);
        startActivityForResult(trans, 0);
    }
};
  }
4

1 に答える 1

2
fos.write("uno=".getBytes());
fos.write(uno.getBytes());
fos.write("\n".getBytes());
fos.write("dos=".getBytes());
fos.write(dos.getBytes());
...

これにより、次のファイルが生成されます。

uno=<editText1 text>
dos=<editText2 text>
...

次に、このファイルを読むと。一度に 1 行ずつ読み取ります。「=」(または使用する区切り文字) で行を分割します。区切り文字の左側のテキストが探しているキーと等しい場合、区切り文字の右側のテキストが取得する必要があるテキストであることがわかります。

個人的には、この方法でファイルを作成する場合は、コードを少しきれいにするためPrintWriter、 only の代わりに使用します。FileOutputStream次のようになります

PrintWriter pw = new PrintWriter(fos);
pw.println("uno=" + uno);
pw.println("dos=" + dos);
...

EDIT(OPから要求されたコードを追加)

これが行うことは、行ごとに読み取られることです。「=」で各行を分割します。次に、分割文字列の 0 番目の位置 (これは「=」の左側にあるもの) とキーを比較します。必要なキーと等しい場合、分割文字列の最初の位置が、取得する実際のテキストになります。

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

String line;
whlie( (line = br.readLine()) != null ){
   String[] separated = line.split("=");
   if( "uno".equals(separated[0]) )
      // Key is uno seaparated[1] has <editText1 text> (assuming example above)
   if( "dos".equals(separated[0]) )
      // Key is dos separated[1] has <editText2 text> (assuming example above)
   ...
}

おそらく、エラー チェックを追加する必要があります。簡単にするために除外しました。

ただし、例として、ユーザーが「=」を含むエディット テキストに何かを入力した場合を想像できます (ユーザーが editText1 に「1+1=2」を入力したとします)。この場合separated、3つの部分があります。

0あなたのキー (例では uno)

1ユーザー入力「=」の左側にユーザ​​ーが入力した最初の部分 (例では「1+1」)

2ユーザー入力「=」の右側にユーザ​​ーが入力した 2 番目の部分 (例では「2」)。

これに対する簡単な解決策は、分離された文字列の残りを単純にループして、すべての情報を確実に取得することです。

if( "uno".equals(separated[0]) ){
   String info = "";
   for( int i=1; i<separated.length; i++ ){
      info += separated[i];
      if( (i+1) < separated.length ){
         info += "="; // This replaces the user input '=' that you split out
      }
   }
   // After this loop info has the exact String the user entered even if it contained your delimiter ('=' in this example)
}

別の注意使用する代わりに使用.split()することもできますがStringTokenizer、ほとんど同じことを行うことができますが、どちらかを好む人もいます。これまでで最も効果的で、あなたにとって意味のあるものを使用してください。両方に慣れていない場合は、2 つのAndroid 分割文字列の使用方法を示す良い投稿をご覧ください。

追加の編集新しいコードでStringTokenizerは推奨されていないようです。Javadoc http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.htmlから

"StringTokenizerは互換性の理由から保持されている従来のクラスですが、新しいコードでの使用は推奨されていません。この機能を求める場合は、代わりにまたはパッケージのsplitメソッドを使用することをお勧めします"Stringjava.util.regex

于 2013-08-16T21:11:45.757 に答える