Проблема с отображением нескольких строк из внутреннего хранилища

У меня есть этот проект, где он отображает информацию о страховании людей, используя два FloatingActionButtons этот контроль TextViews а также EditTexts, Я пытаюсь сохранить эту информацию во внутреннем / внешнем хранилище мобильного устройства. У меня есть код, просто когда информация отображается все Strings привязываться как один большой String, Вот распечатка того, что я имею в виду.

Как видите, все строки, которые должны быть в соответствующих местах, находятся в одной большой строке, которая отображается во всех <code> TextViews </ code TextViews

Вот код, который я использовал для FloatingActionButtons в файле Java называется InsuranceActivity.java:

//Saves information on the editText fields
    FloatingActionButton  saveInfo = (FloatingActionButton) findViewById(R.id.saveInfo);
    saveInfo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String InsurerNameStr = InsurerNameEdit.getText().toString();
            String MembershipStr = MembershipNoEdit.getText().toString();
            String NameStr = NameEdit.getText().toString();
            String DOBStr = DOBEdit.getText().toString();
            String PostcodeStr = PostcodeEdit.getText().toString();
            String file_name = "InsuranceInfo";
            try {
                FileOutputStream fileOutputStream = openFileOutput(file_name,MODE_PRIVATE);
                fileOutputStream.write(InsurerNameStr.getBytes());
                fileOutputStream.write(MembershipStr.getBytes());
                fileOutputStream.write(NameStr.getBytes());
                fileOutputStream.write(DOBStr.getBytes());
                fileOutputStream.write(PostcodeStr.getBytes());
                fileOutputStream.close();
                Toast.makeText(getApplicationContext(), "Information Saved.", Toast.LENGTH_LONG).show();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    //Hides EditText and displays TextViews with the information that was saved
    FloatingActionButton showInfo = (FloatingActionButton) findViewById(R.id.showInfo);
    showInfo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            InsurerNameEdit.setVisibility(View.GONE);
            MembershipNoEdit.setVisibility(View.GONE);
            NameEdit.setVisibility(View.GONE);
            DOBEdit.setVisibility(View.GONE);
            PostcodeEdit.setVisibility(View.GONE);
            InsurerName.setVisibility(View.VISIBLE);
            MembershipNo.setVisibility(View.VISIBLE);
            Name.setVisibility(View.VISIBLE);
            DOB.setVisibility(View.VISIBLE);
            Postcode.setVisibility(View.VISIBLE);

            try {
                String InsurerNameStr;
                String MembershipStr;
                String NameStr;
                String DOBStr;
                String PostcodeStr;

                FileInputStream fileInputStream = openFileInput("InsuranceInfo");
                InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                StringBuffer stringBuffer = new StringBuffer();

                while ((InsurerNameStr = bufferedReader.readLine()) != null) {
                    stringBuffer.append(InsurerNameStr);
                }
                while ((MembershipStr = bufferedReader.readLine()) != null) {
                    stringBuffer.append(MembershipStr);
                }
                while ((NameStr = bufferedReader.readLine()) != null) {
                    stringBuffer.append(NameStr);
                }
                while ((DOBStr = bufferedReader.readLine()) != null) {
                    stringBuffer.append(DOBStr);
                }
                while ((PostcodeStr = bufferedReader.readLine()) != null) {
                    stringBuffer.append(PostcodeStr);
                }

                InsurerName.setText(stringBuffer.toString());
                MembershipNo.setText(stringBuffer.toString());
                Name.setText(stringBuffer.toString());
                DOB.setText(stringBuffer.toString());
                Postcode.setText(stringBuffer.toString());

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

Спасибо за вашу помощь заранее.

1 ответ

Ваш код делает именно то, что вы говорите. Вы сначала читаете содержимое файла в StringBuffer, а затем в строках ниже, вы устанавливаете каждый TextView отображать содержимое этого StringBuffer:

InsurerName.setText(stringBuffer.toString());
MembershipNo.setText(stringBuffer.toString());
Name.setText(stringBuffer.toString());
DOB.setText(stringBuffer.toString());
Postcode.setText(stringBuffer.toString());

Если вы хотите каждый TextView чтобы отобразить что-то другое, вы должны прочитать каждую строку файла отдельно и отобразить содержимое каждой строки в соответствующем TextView, А еще лучше, сериализуйте данные в формате, подобном JSON, который не зависит от порядка записи, и в котором вы можете легко запрашивать конкретные значения.

РЕДАКТИРОВАТЬ

В вашем случае вы можете попробовать что-то вроде этого:

.
.
.
FileInputStream fileInputStream = openFileInput("InsuranceInfo");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

InsurerName.setText(bufferedReader.readLine());
MembershipNo.setText(bufferedReader.readLine());
.
.
.

Конечно, этот подход предполагает, что ваши файлы всегда будут следовать точному формату, всегда будут иметь правильное количество строк и т. Д. Если пользователь случайно создаст новую строку в EditText и что впоследствии сохраняется, весь этот подход сломается. Я, вероятно, не буду использовать это в производственном приложении, но этого должно быть достаточно, чтобы указать вам правильное направление.

(Небольшой совет Java, имена переменных никогда не должны начинаться с заглавной буквы; по соглашению, только имена классов / интерфейсов должны начинаться с заглавной буквы.

Другие вопросы по тегам