如何永久保存 SharedPreferences 中的数据
How to save data in SharedPreferences permanently
我一直在制作一个应用程序,它会在我的应用程序第一次启动时询问一个名字,然后应该显示它但是每当我试图保存我有一个 NullPointerException
或名字
显示为空。
这是我的MainActivity
package com.example.sas;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements namedialog.ExampleDialogListenerName {
private ImageView imageView;
public static final int IMAGE_PICK_CODE = 1000;
private SharedPreferences prefs;
public static final int PERMISSION_CODE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
boolean firststart = preferences.getBoolean("firstStart",true);
if (firststart) {
OpenNameDialog();
}else {
savename();
}
TextView dateview = findViewById(R.id.date);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY");
String date = dateFormat.format(calendar.getTime());
dateview.setText(date);
imageView = findViewById(R.id.selfpicture);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_DENIED){
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
requestPermissions(permissions,PERMISSION_CODE);
}else {
pickImageFromGallery();
}
}else {
pickImageFromGallery();
}
}
});
}
private void OpenNameDialog(){
namedialog namedialog = new namedialog();
namedialog.show(getSupportFragmentManager(),"name dialog");
SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("firstStart",false);
editor.apply();
}
@Override
public void ApplyNameDialog(String name) {
prefs = getSharedPreferences("prefs",MODE_PRIVATE);
final SharedPreferences.Editor editor = prefs.edit();
editor.putString("susanth",name);
}
public void savename(){
String names = prefs.getString("susanth","");
TextView display = findViewById(R.id.namename);
display.setText(names);
}
public void pickImageFromGallery(){
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setType("image/*");
startActivityForResult(intent1,IMAGE_PICK_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_CODE:{
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
pickImageFromGallery();
}else {
Toast.makeText(getApplicationContext(),"Permission Denied",Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE) {
imageView.setImageURI(data.getData());
}
}
}
这是我的namedialog
package com.example.sas;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import java.util.Objects;
public class namedialog extends AppCompatDialogFragment {
private EditText name ;
private ExampleDialogListenerName listener;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = Objects.requireNonNull(getActivity()).getLayoutInflater();
View view = inflater.inflate(R.layout.namedialog,null);
builder.setView(view)
.setTitle("Welcome Fill your details")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String namef = name.getText().toString();
listener.ApplyNameDialog(namef);
}
});
name = view.findViewById(R.id.etname);
return builder.create();
}
@Override
public void onAttach(@NonNull Context context) {
context = getActivity();
super.onAttach(context);
try {
listener = (ExampleDialogListenerName) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()+
"must implement ExampleDialogListenerName");
}
}
public interface ExampleDialogListenerName{
void ApplyNameDialog (String name);
}
}
你能告诉我应该用什么来永久存储名字吗?
请帮助我快速谢谢 :)
我一直在制作一个应用程序,它会在我的应用程序第一次启动时询问一个名字,然后应该显示它但是每当我试图保存我有一个 NullPointerException
或名字
显示为空。
这是我的MainActivity
package com.example.sas;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements namedialog.ExampleDialogListenerName {
private ImageView imageView;
public static final int IMAGE_PICK_CODE = 1000;
private SharedPreferences prefs;
public static final int PERMISSION_CODE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
boolean firststart = preferences.getBoolean("firstStart",true);
if (firststart) {
OpenNameDialog();
}else {
savename();
}
TextView dateview = findViewById(R.id.date);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY");
String date = dateFormat.format(calendar.getTime());
dateview.setText(date);
imageView = findViewById(R.id.selfpicture);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE ) == PackageManager.PERMISSION_DENIED){
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
requestPermissions(permissions,PERMISSION_CODE);
}else {
pickImageFromGallery();
}
}else {
pickImageFromGallery();
}
}
});
}
private void OpenNameDialog(){
namedialog namedialog = new namedialog();
namedialog.show(getSupportFragmentManager(),"name dialog");
SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("firstStart",false);
editor.apply();
}
@Override
public void ApplyNameDialog(String name) {
prefs = getSharedPreferences("prefs",MODE_PRIVATE);
final SharedPreferences.Editor editor = prefs.edit();
editor.putString("susanth",name);
}
public void savename(){
String names = prefs.getString("susanth","");
TextView display = findViewById(R.id.namename);
display.setText(names);
}
public void pickImageFromGallery(){
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setType("image/*");
startActivityForResult(intent1,IMAGE_PICK_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_CODE:{
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
pickImageFromGallery();
}else {
Toast.makeText(getApplicationContext(),"Permission Denied",Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE) {
imageView.setImageURI(data.getData());
}
}
}
这是我的namedialog
package com.example.sas;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import java.util.Objects;
public class namedialog extends AppCompatDialogFragment {
private EditText name ;
private ExampleDialogListenerName listener;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = Objects.requireNonNull(getActivity()).getLayoutInflater();
View view = inflater.inflate(R.layout.namedialog,null);
builder.setView(view)
.setTitle("Welcome Fill your details")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String namef = name.getText().toString();
listener.ApplyNameDialog(namef);
}
});
name = view.findViewById(R.id.etname);
return builder.create();
}
@Override
public void onAttach(@NonNull Context context) {
context = getActivity();
super.onAttach(context);
try {
listener = (ExampleDialogListenerName) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()+
"must implement ExampleDialogListenerName");
}
}
public interface ExampleDialogListenerName{
void ApplyNameDialog (String name);
}
}
你能告诉我应该用什么来永久存储名字吗? 请帮助我快速谢谢 :)