【问题标题】:How to retrieve editText saved value after reopening the application?重新打开应用程序后如何检索editText保存的值?
【发布时间】:2014-04-15 23:03:07
【问题描述】:

我创建了一个列表视图活动,它在项目点击时打开对话框。在对话框中,用户可以在同一个列表视图项中输入保存在 textView 中的不同值。这很完美,问题是如果我关闭应用程序,当我再次打开它时,保存的值就不再存在了。关闭应用后如何保值?谢谢!!!

NoteAdapter.java

        package com.cngcnasaud.orar;

import java.util.Arrays;

import android.app.Dialog;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class NoteAdapter extends BaseAdapter {

    String[] result;
    Context context;
    int[] imageId;
    private static LayoutInflater inflater = null;
    private Dialog dialog;
    String[] savedEntries;
    String[] saved = null;

    public NoteAdapter(Note note, String[] prgmNameList, String[] saved) {
        // TODO Auto-generated constructor stub
        result = prgmNameList;
        context = note;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (saved == null) {
            savedEntries = new String[result.length];
            Arrays.fill(savedEntries, "");
        } else
            savedEntries = saved;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return result.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return savedEntries[position];
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder {
        TextView tv;
        ImageView img;
        public TextView text;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        final Holder holder = new Holder();
        View rowView;
        rowView = inflater.inflate(R.layout.note_items, null);
        holder.tv = (TextView) rowView.findViewById(R.id.textView1);
        holder.text = (TextView) rowView.findViewById(R.id.textView2);
        holder.text.setText(savedEntries[position]);
        holder.img = (ImageView) rowView.findViewById(R.id.imageView1);

        rowView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                dialog = new Dialog(context);
                dialog.setContentView(R.layout.dialog);
                dialog.setTitle("Materie:" + result[position]);

                final EditText txtMode = (EditText) dialog
                        .findViewById(R.id.dialog);
                Button btnSave = (Button) dialog.findViewById(R.id.bsave);

                btnSave.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        String data = txtMode.getText().toString();
                        holder.text.setText(data);

                        savedEntries[position] = data;

                        dialog.dismiss();
                        Log.d("data", data);
                    }
                });
                dialog.show();
            }

        });
        return rowView;
    }

}

Note.java

    package com.cngcnasaud.orar;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.Menu;

import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Note extends Activity {

    public static final ListAdapter NoteAdapter = null;
    ListView lv;
    Context context;
    ArrayList<?> prgmName;
    TextView text;

    public static String[] prgmNameList = { "Romana   - ", "Matematica   - ",
            "Lb. Engleza   - ", "Lb. Germana/Franceza - ", "Istorie   - ",
            "Geografie   - ", "Biologie   - ", "Fizica   - ", "Ed. Fizica   - " };

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

        text = (TextView) findViewById(R.id.textView2);

        context = this;

        lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(new NoteAdapter(this, prgmNameList, null));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub

        NoteAdapter adapter = (NoteAdapter) lv.getAdapter();

        // Variable is public for clarity.
        String toSave = EncodeDecode.encode(adapter.savedEntries);
        SharedPreferences.Editor editor = getSharedPreferences("LV Data",
                MODE_PRIVATE).edit();
        editor.putString("TVEntries", toSave);
        editor.commit();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub

        SharedPreferences prefs = getSharedPreferences("LV Data", MODE_PRIVATE);
        String encoded = prefs.getString("TVEntries", "");

        String[] entries;
        if (encoded.equals(""))
            entries = null;
        else
            entries = EncodeDecode.decode(encoded);

        NoteAdapter adapter = (NoteAdapter) lv.getAdapter();
        adapter.savedEntries = entries;
        lv.setAdapter(adapter);

        super.onResume();
    }

}

【问题讨论】:

  • 你为什么不把你从对话框中得到的值输入到数据库中,然后从数据库中检索那个值??
  • 这是一个非常好的想法,但是如何在代码中做到呢?
  • androidhive.info/2011/11/android-sqlite-database-tutorial 。看看链接,它是一个很好的例子..
  • 所有这些都是为了这个简单的问题?不能用一个简单的 SharedPrefences 来完成吗?
  • @Andrei 我认为可以。它基本上归结为将字符串列表转换为单个字符串并返回。

标签: android listview sharedpreferences


【解决方案1】:

这是一个涉及SharedPreferences的建议解决方案:

  • 首先,将String[] 实例变量添加到您的适配器类。这将包含您要保存的内容(TextViews 中的字段。初始化这个您的构造函数。

    public NoteAdapter(Note note, String[] saved, String[] prgmNameList, int[] prgmImages) {
      result=prgmNameList;
      context=note;
      imageId=prgmImages;
      inflater = ( LayoutInflater )context.
             getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
      /**********INSERTED CODE********/
      if(saved == null) {
        savedEntries = new String[result.length];`
        Arrays.fill(savedEntires, "");
      }
      else
        savedEntries = saved;
      /****************************/
    
    
    }
    
  • 同时修改您覆盖的 getItem() 方法以在 savedEntires 中返回适当的元素:

    @Override
    public Object getItem(int position) {
     return savedEntries[position];
    }
    
  • 每当您更新 TextView 时,相应地更新列表:

    @Override
    public void onClick(View v) {
    
      String data = txtMode.getText().toString();
      holder.text.setText(data);
    
      /***INSERTED CODE****/  
      savedEntries[position] = data;
      /*******************/
    
      dialog.dismiss();
      Log.d("data", data);
    
    }
    
  • 我们将使用字符串-字符串对将此数组保存在 SharedPreferences 中。由于字符串可能包含任何字符,因此很难/效率低下找到单个分隔符。我实现了一个名为 EncodeDecode 的类,它可以将 String 数组编码为单个格式化的 String,并在此处将其解码回 String 数组:https://gist.github.com/liangricha/10759438。我将使用这个类来转换/取消转换savedEntries

  • 当你想保存savedEntries(在onStop())时,只需执行以下代码:

    ListView lv = //... get reference
    NoteAdapter adapter = (NoteAdapter)lv.getAdapter();
    
    //Variable is public for clarity.
    String toSave = EncodeDecode.encode(adapter.savedEntries);
    SharedPreferences.Editor editor = getSharedPreferences("LV Data", MODE_PRIVATE).editor();
    editor.putString("TVEntries", toSave);
    editor.commit();
    
  • 当您想要检索 TextView 条目的 String 数组时(在 onResume() 中),执行:

    SharedPreferences prefs = getSharedPreferences("LV Data", MODE_PRIVATE);
    String encoded = prefs.getString("TVEntries", "");
    
    String[] entries
    if(encoded.equals(""))
      entries = null;
    else
      entries = EncodeDeocde.decode(encoded);
    
    NoteAdapter adapter = (NoteAdapter)lv.getAdapter();
    adapter.savedEntries = entries;
    lv.setAdapter(adapter);
    

    然后,在“NoteAdapter”的getView() 方法中,将TextView 的字段设置为savedEntries 中的相应条目:

     holder.text.setText(savedEntries[position]);
    

【讨论】:

  • 你解释得很好,我完全理解你的意思,但我只有一件事:我应该在哪种方法中调用 savedEntries?这个 savedEntries 应该在 NoteAdapter 中调用,因为这是输入的值保存在 textview 中的地方,但是在哪里呢?我的意思是,savedEntries 将在单击按钮时调用,或者我们可以在退出时调用它?这个怎么做? .然后,在检索 String 数组时,也有一些东西。此检索应称为 onCreate?因为我想在activity开始的时候有保存的String数组,所以这种方式是对的吧?非常感谢。很好的例子!
  • @Andrei 我会覆盖 onStop(),并将 savedEntries 保存到 SharedPreferences 那里。用于获取savedEntries, I would override onResume()` 并从SharedPreferences 那里获取它,因为这将保证您在使用返回箭头返回您的 ListView 活动等情况下拥有已保存的字符串...等。
  • 你能给我解释一下吗?这是我第一次使用扩展 BaseAdapter 的活动,并且在 BaseAdapter 中没有 onStop() 方法。要做到这一点,我是不是应该先扩展 Activity,把 onStop() 方法,然后让 BaseAdapter 一样?它应该那样工作吗?如果没有,你建议怎么做?
  • @Andrei 在您实际为 ListView 设置适配器和充气的 Activity 类中,您必须重写 onStop() 方法才能保存和 onResume() 方法才能检索.
  • 全局是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多