如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?相关的知识,希望对你有一定的参考价值。

我有两个类,一个类是保存重量,然后在另一个类/活动中我想要一个日志,它将权重与日期和时间相加,然后创建一个新行并显示下一个权重。这样,用户可以跟踪他们的日常体重变化。

问题是我对Java来说是全新的,显然我遇到了一个愚蠢的问题。每次我尝试追加它只是覆盖。我可能需要保存然后添加它?也许?我尝试了一些不同的东西,没有什么能做得那么好。

这是Java的第3天。道歉。

尝试制作使用共享偏好保存的列表。要么做错了要么没有用。也尝试只是呼吁权重并附加它,但它覆盖了所有。

我的记录活动:

public class LogActivity extends AppCompatActivity {

    TextView logger;
    //TextView more;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_log);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        Button back = findViewById(R.id.btnBack);

        logger = findViewById(R.id.txtLog);

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();


        SharedPreferences log = getSharedPreferences("MyPrefsFile", 0);

        //Float value = log.getFloat("floatingLog",0);
        Float value = log.getFloat("weight", 0);
        //more.append(logger + "Weight: " + value.toString() + " at: " + dateFormat.format(date) + "
");
        logger.append("Weight: " + value.toString() + " at: " + dateFormat.format(date) + "
");

        // Adding back button
        back.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v){
                Intent i = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(i);
            }
        });

//        SharedPreferences settings7 = getSharedPreferences("PREFS",0);
//        String wordsString = settings7.getString("words","");
//        String[] itemWords = wordsString.split(",");
//        List<String> items = new ArrayList<String>();
//        for (int i = 0; i < itemWords.length; i++){
//            items.add(itemWords[i]);
//        }
//        for (int i = 0; i < items.size(); i++){
//            Log.d("list", items.get(i));
//        }




    }
}

这是从我的ProfileActivity中获取共享偏好:

 save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((TextView) findViewById(R.id.txtWeight)).setText(findViewById(R.id.txtNewWeight).toString());
                floatingLog = weight.toString();
                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                SharedPreferences.Editor editor = settings.edit();
                floatingWeight = Float.valueOf(newWeight.getText().toString());

                editor.putString("floatingLog", floatingLog);
                editor.putFloat("weight", floatingWeight);
                editor.apply();
                editor.commit();
                weight.setText(String.valueOf(floatingWeight));
答案

您好,欢迎来到SO!

实际上在TextView中,您可以通过TextView#getText()访问当前值,之后您可以使用TextView#setText(String text)类似地更新文本值

所以你需要写这样的东西:

String currentText = logger.getText();
String updatedText = currentText + "Weight: " + value.toString() + " at: " + dateFormat.format(date) + "
";
logger.setText(updatedText)

那么!

UPDATE

我认为你的问题在于你如何在sharedPrefs这行中保存你的记录editor.putFloat("weight", floatingWeight);在这一部分你覆盖现有的价值,我想到的最简单的方法是,不是像这样保存重量,而是创建一个权重数组并且每天追加到它的末尾并存储数组。如果你使用数据库为你提供更大的灵活性,那将会更好。

使用数据库看看android官方orm Android Room它非常简单明了

以上是关于如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SharedPreferences 从 Flutter 中的列表中保存多个布尔值

如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态

如何在改变sharedpreferences数据后自动改变android menuItem数据?

Android持久化技术

Android持久化技术

注销清除 SharedPreferences