我遇到了保存用户在我的android活动类上输入的数据的问题。我已经确定我需要使用onSavedInstanceState(Bundle outState)
方法,但编写程序的方式使这很困难。
用户在DataEntry.java
课程中输入各种数据,他们提交的信息会显示在DataSummary.java
上。这很好用。
但是,如果用户离开DataSummary.java
说,要填写DataEntry.java
上的其他信息,如果您返回DS.java
查看内容,则原始提交的数据会丢失你已经写过了。以下是DataSummary.java
的代码。
public class DataSummary extends Activity {
ImageView resultImage;
TextView resultName;
TextView resultDescription;
TextView resultType;
TextView resultProject;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_summary);
//Check if there is anything in the 'bundle' and if not produce message - AVOIDS NULLPOINTEREXCEPTION when navigating to Activity
Bundle bundle = this.getIntent().getExtras();
if (bundle != null){
int image = bundle.getInt("image");
String name = bundle.getString("key");
String description = bundle.getString("key1"); //gets data from DataEntry activity
String type = bundle.getString("key2");
String project = bundle.getString("key3");
resultImage=(ImageView)findViewById(R.id.resultImage);
resultName=(TextView)findViewById(R.id.resultName); //adds the TextViews to the activity
resultType=(TextView)findViewById(R.id.resultType);
resultDescription=(TextView)findViewById(R.id.resultDesc);
resultProject=(TextView)findViewById(R.id.resultProject);
resultImage.setImageResource(image);
resultName.setText(name); // Fills the textviews with imported data
resultType.setText(type);
resultDescription.setText(description);
resultProject.setText(project);
}
else
{
Toast.makeText(DataSummary.this,"Received no data yet!", Toast.LENGTH_LONG).show();
}
}
/* MANAGES ACTIVITY LIFESTYLE */
public void onSavedInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
}
如何扩展onSavedInstanceState
方法以获取创建活动时收到的导入数据,并在用户导航离开此活动时保留它?希望能够解释得足够好吗?
很难弄清楚如何利用onCreate中的变量以及我无法从其他方法访问它们(我想如果我知道如何做到这一点我可以完成该方法)。
答案 0 :(得分:1)
您可以在班级上设置静态变量。当用户输入数据时,您只需在变量上写入该数据。当用户返回应用程序时,您只需将存储在变量中的数据写入EditTexts。
编辑:示例
假设您有2个EditTexts et1和et2,它们存储的值是用户名和邮件。
public class DataEntryActivity extends Activity{
private static String username;
private static String mail;
@Override
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.layout_data_entry);
EditText et1 = (EditText) findViewById(R.id.editTextUsername);
EditText et2 = (EditText) findViewById(R.id.editTextMail);
if (username != null)
et1.setText(username);
if (mail != null)
et2.setText(mail);
Button save = (Button) findViewById(R.id.saveButton);
save.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if (et1.getText().toString().length() > 0)
username = et1.getText().toString();
if (et2.getText().toString().length() > 0)
mail = et2.getText().toString();
Intent intent = new Intent(DataEntryActivity.this, YourOtherActivity.class);
startActivity(intent);
}
});
}
public static String getUsername(){
return username;
}
public static String getMail(){
return mail;
}
}
从您的其他活动中,您只需调用DataEntryActivity.getUsername()和DataEntryActivity.getMail()即可将其恢复。
答案 1 :(得分:1)
我建议你看一下这篇文章,它清楚地解释了如何在整个应用程序中使用全局变量。
答案 2 :(得分:1)
这是您可以使用的一个逻辑。从意图中获取数据后,将其保存到应用程序的共享首选项中。每次进入此活动时,检查共享首选项中是否存在这些键,如果存在,则获取并显示它们,否则从已保存的实例状态中检索它们并将它们写入共享首选项。
在DataEntry活动的onStop()方法中,清除这些共享首选项。
所以,用户来自
DataEntry-->DataSummary ----check shared preferences in DataSummary, if data exists, use it. If some data exists or no data exists, get others from bundle and write it here.
通过这种方式,每当用户来回走动时,无论他输入什么,都会在共享偏好中存在。然后,
DataEntry--->Exit app or press back button, clear shared preferences fields so that when this activity is created next time (when user comes here again), he gets a clean slate
答案 3 :(得分:0)
如果我理解正确,您希望在两个活动之间分享全局状态。您无法使用savedInstanceState处理此问题,因为当您从DataSummary导航回DataEntry,然后再次前进到DataSummary时,新的DataSummary是一个不同的实例,并且不会获取您之前保存的savedInstanceState。
为了使其工作,您必须通过intent而不是savedInstanceState传递DataSummary添加的数据。为了获取在DataSummary中输入的数据,您可以使用startActivityForResult将其从DataSummary返回到DataEntry: http://developer.android.com/reference/android/app/Activity.html#StartingActivities
使用静态全局变量不起作用,因为如果在后台终止应用程序,静态全局变量将丢失。
使用共享首选项,文件或数据库可能会起作用,但它不是很方便,也不是很优雅(您与整个应用程序共享数据,而通过意图进行通信会限制对两个活动的数据访问)。
答案 4 :(得分:0)
对于初学者,您不应使用onSavedInstanceState
在Activity
个实例之间传递信息。在活动之间共享状态有不同的方法,一种是扩展Application
类并将其用作单例。您也可以使用常规单例,但扩展Application
的好处是保证在应用程序启动时调用其onCreate
方法。
public class YourApplication extends Application {
private static YourApplication mInstance;
private mDataState;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
mDataState = new DataState();
}
public static YourApplication getInstance() {
return mInstance;
}
public DataState getDataState() {
return mDataState;
}
public void setDataState(DataState dataState) {
mDataState = dataState;
}
}
现在,setDataState
活动中的DataEntry
和getDataState
活动中的DataSummary
可以使用{YourApplication
获取getInstance
的唯一实例1}}方法。在onCreate
DataEntry
方法中获取存储的值可能是一个想法,因此用户可以看到之前输入的内容。