2016-12-10 42 views
0

我对此很感兴趣,并在制作应用程序方面取得稳步进展。我想创建一个应用程序,允许用户使用滑块生成随机密码来设置长度,然后生成它。一旦完成,我希望用户能够保存他们生成的密码。到目前为止,我已经实现了一切,除了保存密码以便在应用程序关闭后进行恢复。我已经阅读了很多文章,并且我只是不知道如何在应用程序关闭后保存应用程序数据,天气是文件还是SharedPrefrences。一些澄清和帮助将非常感激。如何在Android中保存TextView/Array并稍后检索?

我想实现

我想,当他们关闭它的用户点击,他们已经生成的密码(存储在该数组中)被保存在应用程序,然后一个按钮,来什么回来后,他们可以检索这些保存的密码。

感谢大家在先进的,我做我的乞求原谅有关的代码它可能非常混乱,但我学习:d

感谢

-Jack

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++){ 
    } 
} 
+0

你想要一个数据库。 SharedPreferences中的列表不能很好地工作。 https://developer.android.com/training/basics/data-storage/databases.html –

回答

0

您可以将数据保存到SharedPreferences

//创建共享p参考

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

这里,Name是veriable包含用户名,veriable password包含密码存储

读取数据

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

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

+1

这对于一个用户和一个密码来说是一个很好的解决方案,但我相信问题是关于保存多个问题。你可以改为使用户名密钥和密码的价值,我猜 –

+0

多数民众赞成在!但是,在屏幕截图中,没有用于输入名称的选项。请为每个用户设置一个唯一的ID,例如。 user01,user02 ...并单击查看密码按钮时显示所有用户名和密码 –

+1

好的,用户密钥始终相同。尽管如此,存储可能无限长字符串的列表并非如何使用SharedPreferences –

0

使用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(); 
} 

希望它可以帮助!

+0

谢谢!我没有使用这种方法,但我仍然感谢你的信息:) –

相关问题