【问题标题】:How to save TextView/Array in Android and Retrieve it later?如何在 Android 中保存 TextView/Array 并稍后检索?
【发布时间】:2016-12-10 15:21:50
【问题描述】:

我对此真的很陌生,并且在申请方面取得了稳步进展。我想创建一个应用程序,允许用户使用滑块生成随机密码来设置长度,然后让它生成。完成此操作后,我希望用户能够保存他们生成的密码。到目前为止,除了保存密码以便稍后在应用程序关闭后恢复之外,我已经完成了所有工作。我已经阅读了很多帖子,但我只是不明白如何在应用程序关闭后保存应用程序数据,将其保存到文件或 SharedPrefrences。非常感谢您的澄清和帮助。

我想要实现的目标

我想要一个用户单击的按钮,并且他们生成的密码(存储在该数组中)保存在应用程序中,然后当他们关闭它并稍后返回时,他们可以检索那些保存的密码。

感谢各位前辈,请原谅我的代码可能非常混乱,但我正在学习:D

谢谢

-杰克

MainActivity Screenshot

主要活动 XML:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.jrfapplications.passgen.MainActivity">

    <SeekBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/passdesc"
        android:layout_marginTop="27dp"
        android:id="@+id/seekBar"
        android:max="20"
        android:progress="10"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:text="@string/passbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:textSize="12sp"
        android:onClick="genpass"
        android:layout_marginTop="40dp"
        android:layout_below="@+id/seekBar"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/seekBar"
        android:layout_centerHorizontal="true"
        android:text="@string/SeekValueView"
        android:id="@+id/SeekTextView" />

    <TextView
        android:text="@string/pass_desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/pass_desc_size"
        android:id="@+id/passdesc"
        android:textAlignment="center"
        android:layout_marginTop="122dp"
        android:layout_below="@+id/password"
        android:layout_centerHorizontal="true" />

    <TextView
        android:text="@string/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/password"
        android:textSize="@dimen/password"
        android:layout_marginTop="86dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <Button
        android:text="@string/NextPageText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button"
        android:id="@+id/button2"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button"
        android:layout_alignRight="@+id/button"
        android:layout_alignEnd="@+id/button"
        android:onClick="goToSavedPassActivity"
        android:textSize="12sp" />

</RelativeLayout>

主要活动 Java:

    public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final TextView mPassword;
    Button mGenPassButton;      //Defining Variables
    final TextView mSeekBarValue;
    Button mSavedPassActivity;

    mPassword = (TextView) findViewById(R.id.password);
    mGenPassButton = (Button) findViewById(R.id.button);        //Settings values and locations
    mSeekBarValue = (TextView) findViewById(R.id.SeekTextView);
    SeekBar seek=(SeekBar) findViewById(R.id.seekBar);
    mSavedPassActivity = (Button) findViewById(R.id.button2);

    seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { //Seekbar Actions

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { //When user moves it
            // TODO Auto-generated method stub
            SeekBarValue.seekval = progress;
            mSeekBarValue.setText(String.valueOf(progress));

        }
    });

    mSavedPassActivity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, SavedPassActivity.class));
        }
    });

    mGenPassButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
            final StringBuilder sb = new StringBuilder();
            Random random = new Random();
            for (int i = 0; i < SeekBarValue.seekval; i++) {
                char c = chars[random.nextInt(chars.length)];
                sb.append(c);
            }

            final String output = sb.toString();
            mPassword.setText(output);
            SavedPassArray.SavedPasswords.add(output);
        }
    });

    }
}

SeekBarValue Java:

    public class SeekBarValue {
public static int seekval;
}

SavedPassedArray Java:

    public class SeekBarValue {
public static int seekval;
}

ViewPasswordActivity ScreenShot

密码查看活动 XML:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_saved_pass"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.jrfapplications.passgen.SavedPassActivity">

    <TextView
        android:text="@string/PassList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/PasswordsList"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:textSize="18sp"
        android:scrollbars="vertical"
        android:textStyle="normal|bold" />
</RelativeLayout>

密码查看 Java:

public class SavedPassActivity extends AppCompatActivity {

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

    final TextView mPasswordsLists;

    mPasswordsLists = (TextView) findViewById(R.id.PasswordsList);

    StringBuilder allpasswords = new StringBuilder();

    for (String s : SavedPasswords ){
        if(allpasswords.length() > 0){
            allpasswords.append("\n");
        }
        allpasswords.append(s);        }

    mPasswordsLists.setText(allpasswords.toString());
    mPasswordsLists.setMovementMethod(new ScrollingMovementMethod());

    //for(int i=0; i < SavedPasswords.size(); i++){
    }
}

【问题讨论】:

标签: java android xml android-layout sharedpreferences


【解决方案1】:

您可以将数据保存在SharedPreferences

//创建共享偏好

SharedPreferences.Editor prefsEditor = getSharedPreferences("User", MODE_PRIVATE).edit();
prefsEditor.putString("User", Name);
prefsEditor.putString("Password", password);
prefsEditor.commit();

这里,Name是一个veriable包含用户名,veriablepassword包含要存储的密码

读取数据

SharedPreferences prefs = getSharedPreferences("User", MODE_PRIVATE);
String Name = prefs.getString("Name", null);
String password = prefs.getString("Password", null);

null 很重要,如果条目Name 不存在,那么它会返回null。如果你把“Guest”而不是null,那么当Name 不存在时它会返回“Guest”。

【讨论】:

  • 这对于一个用户和一个密码来说是一个很好的解决方案,但我相信这个问题是关于保存多个。我猜您可以改为将用户名设为密钥,将密码设为值
  • 天哪!但是,在屏幕截图中没有输入名称的选项。所以为每个用户创建一个唯一的 ID,例如。 user01, user02 ...点击查看密码按钮时显示所有用户名和密码
  • 好的,用户密钥始终相同。尽管如此,存储可能无限的字符串列表并不是 SharedPreferences 的使用方式
  • 谢谢!非常感谢
【解决方案2】:

使用 Json,

像这样创建 JsonObeject,

    try {
        JSONObject user = new JSONObject();
        user.put("Id","Id of the user");
        user.put("Name","name of the user");
        user.put("Password","password for the user");  
    } catch (JSONException e) {
        e.printStackTrace();
    }

然后将每个用户添加到一个 jsonArray

    try {

        JSONObject object = new JSONObject();
        object.put("Id","Id of the user");
        object.put("Name","name of the user");
        object.put("Password","password for the user");

        JSONArray array = new JSONArray();
        array.put(object);

    } catch (JSONException e) {
        e.printStackTrace();
    }

您可以将数组保存在 SharedPreferences 中

//创建共享偏好

SharedPreferences.Editor prefsEditor = getSharedPreferences("User", MODE_PRIVATE).edit();
prefsEditor.putString("Users", array.toString());
prefsEditor.commit();

读取数组

SharedPreferences prefs = getSharedPreferences("User", MODE_PRIVATE);
String arrayString = prefs.getString("Users", null);

将字符串转换为jsonArray

JSONArray array = new JSONArray(arrayString);

在这里你可以像这样显示所有用户的id、名称和密码

try {

    for (int i = 0; i < array.length(); i++) {
        JSONObject user = array.getJSONObject(i);

        textViewId.setText(user.getString("Id"));
        textViewName.setText(user.getString("Name"));
        textViewPassword.setText(user.getString("Password"));
    }

} catch (JSONException e) {
    e.printStackTrace();
}

您可以像这样使用 Id 搜索用户,

try {

    for (int i = 0; i < array.length(); i++) {
        JSONObject user = array.getJSONObject(i);

        if (user.getString("Id").equals("Required Id")) {

            textViewId.setText(user.getString("Id"));
            textViewName.setText(user.getString("Name"));
            textViewPassword.setText(user.getString("Password"));
            break;
        }
    }

} catch (JSONException e) {
    e.printStackTrace();
}

你可以用这样的名字搜索用户,

try {

    for (int i = 0; i < array.length(); i++) {
        JSONObject user = array.getJSONObject(i);

        if (user.getString("Name").equals("Required Name")) {

            textViewId.setText(user.getString("Id"));
            textViewName.setText(user.getString("Name"));
            textViewPassword.setText(user.getString("Password"));
            break;
        }
    }

} catch (JSONException e) {
    e.printStackTrace();
}

希望对你有帮助!!!

【讨论】:

  • 谢谢!我没有使用过这种方法,但我仍然感谢您提供的信息:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多