在 Android 中重新启动时保存更改字符串

Posted

技术标签:

【中文标题】在 Android 中重新启动时保存更改字符串【英文标题】:Save change String on restart in Android 【发布时间】:2016-07-03 10:48:38 【问题描述】:

我正在构建一个应用程序,其中有一个带有字符串和按钮的数组列表。 当我按下按钮时,它会从列表中删除字符串(使用 string.remove)并将其显示在另一个活动中.. 问题是当我关闭应用程序并重新打开它时,一切都会恢复正常。如何保存所做的更改?

代码如下:

     public class TasksActivity extends AppCompatActivity 

private static ArrayList<String> list;


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_tasks);

    final Button tasksbtn = (Button) findViewById(R.id.btnfortasks);
    Button checkTask = (Button) findViewById(R.id.remove_case);

    final TextView tasksView = (TextView) findViewById(R.id.tasks_textView);



    final ArrayList<String> tasks = new ArrayList<String>();
    tasks.add("one");
    tasks.add("two");
    tasks.add("three");
    tasks.add("four");
    tasks.add("five");
    tasks.add("six");





    Collections.shuffle(tasks);
    tasksView.setText(tasks.get(0));


    assert tasksbtn != null;
    tasksbtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Collections.shuffle(tasks);
            tasksView.setText(tasks.get(0));


        
    );



    checkTask.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent intent = new Intent(TasksActivity.this, CompletedTasks.class);
            intent.putExtra("completedTasks", tasks.get(0));
            tasks.remove(tasks.get(0));
            startActivity(intent);

        
    ); 






 

还有第二个活动

    public class CompletedTasks extends AppCompatActivity 

String completedTasks;
Global_Variable object = new Global_Variable();


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


    TextView completedTasksView = (TextView) findViewById(R.id.completed_tasks);


    Intent intent = getIntent();

    completedTasks = intent.getExtras().getString("completedTasks");
    object.tasks.add(completedTasks + "\n");



    String a = "";
    for (int i = 0; i < object.tasks.size(); i++) 
        a += object.tasks.get (i);
        completedTasksView.setText(a);
        Log.d("a", "a---------" + a);


    


  

【问题讨论】:

感谢您的反对票.. 真的很有帮助.. :/ 这可能是因为您没有提供任何代码。如果不看代码,通常很难帮助或理解您尝试实现的目标。 好的,我将提供我的代码,但我认为以@babadaba 提到的共享偏好等一般方式学习这一点更有帮助..(对不起我的英语) 【参考方案1】:

您可能应该尝试序列化。请看下面的示例。

 public class SerializationDemo extends Activity 
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Person person = new Person();
    person.setName("CoderzHeaven");
    person.setAddress("CoderzHeaven India");
    person.setNumber("1234567890"); 

    //save the object
    saveObject(person);

    // Get the Object
    Person person1 = (Person)loadSerializedObject(new File("/sdcard/save_object.bin")); //get the serialized object from the sdcard and caste it into the Person class.
    System.out.println("Name : " + person1.getName());


public void saveObject(Person p)
     try
     
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("/sdcard/save_object.bin"))); //Select where you wish to save the file...
        oos.writeObject(p); // write the class as an 'object'
        oos.flush(); // flush the stream to insure all of the information was written to 'save_object.bin'
        oos.close();// close the stream
     
     catch(Exception ex)
     
        Log.v("Serialization Save Error : ",ex.getMessage());
        ex.printStackTrace();
     


public Object loadSerializedObject(File f)

    try
    
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
        Object o = ois.readObject();
        return o;
    
    catch(Exception ex)
    
    Log.v("Serialization Read Error : ",ex.getMessage());
        ex.printStackTrace();
    
    return null;

 Person implements Serializable //Added implements Serializable

String name="";
private String number="";
private String address=""; 
private static final long serialVersionUID = 46543445; 

public void setName(String name)

    this.name = name;


public void setNumber(String number)

    this.number = number;


public void setAddress(String address)

    this.address = address;


public String getName()

    return name;


public String getNumber()

    return number;


public String getAddress()

    return address;

   
   

【讨论】:

【参考方案2】:

您可以尝试将更改保存到 SharedPreferences。然后,当您重新启动您的应用程序时,从您的 ShraredPreferences 中读取更改并将其应用到您的 ListView 或您正在使用的任何东西。

您可以在此处阅读有关 SharedPreferences 的更多信息:https://developer.android.com/training/basics/data-storage/shared-preferences.html

【讨论】:

所以如果我删除一个字符串,SharedPreferences 会保存列表,这样就不会再看到它了? 是的。您可能应该使用 ListView 或 RecyclerView 来显示您的任务。使用带有 \n 的 TextView 并不常见。 好的,我会试试你的方法。。谢谢 :)

以上是关于在 Android 中重新启动时保存更改字符串的主要内容,如果未能解决你的问题,请参考以下文章

保存我的唯一 ID(字符串)并稍后在我重新启动 Java 应用程序时检索它

每次 Gulpfile 更改后如何重新启动 Gulp?

Android:应用程序重新启动后,保存在 getFilesDir() 中的文件消失

重新启动应用程序时获取 ArrayList?

我可以在android中完全重新启动服务吗?

重新启动应用程序时不会加载 ArrayList