Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不同的活动中保存数据_Java_Android - Fatal编程技术网

Java 在不同的活动中保存数据

Java 在不同的活动中保存数据,java,android,Java,Android,我在保存用户在我的android活动类上输入的数据时遇到了问题。我已经确定我需要使用onSavedInstanceState(Bundle-outState)方法,但是我的程序的编写方式使得这很困难 用户在DataEntry.java类中输入各种数据,他们提交的信息显示在DataSummary.java上。这个很好用 但是当用户离开DataSummary.java时,如果您返回DS.java查看您已经编写的内容,则原始提交的数据将丢失。下面是DataSummary.java的代码 public

我在保存用户在我的android活动类上输入的数据时遇到了问题。我已经确定我需要使用
onSavedInstanceState(Bundle-outState)
方法,但是我的程序的编写方式使得这很困难

用户在
DataEntry.java
类中输入各种数据,他们提交的信息显示在
DataSummary.java
上。这个很好用

但是当用户离开
DataSummary.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中的变量,因为我无法从另一个方法访问它们(我想如果我知道如何使用,我可以完成该方法)。

您可以在类中设置静态变量。当用户输入数据时,您只需将数据写入变量。当用户返回应用程序时,您只需将存储在变量中的数据写入编辑文本

编辑:示例

假设您有两个EditText et1和et2,它们存储的值是username和mail

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()即可将它们取回。

我建议您看看这篇文章,它清楚地解释了如何在整个应用程序中使用全局变量


这里有一个逻辑可以使用。从intent获取数据后,将其保存到应用程序的共享首选项中。每次进入此活动时,请检查共享首选项中是否存在这些键,如果存在,则获取并显示它们,否则从保存的实例状态中检索它们并将它们写入共享首选项

在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

如果我理解正确,您希望在两个活动之间共享一个全局状态。您无法使用savedInstanceState处理此问题,因为当您从DataSummary导航回DataEntry,然后再次前进到DataSummary时,新的DataSummary是另一个实例,并且不会获取以前保存的savedInstanceState

为了使其工作,必须通过intent而不是savedInstanceState传递DataSummary添加的数据。为了获取在DataSummary中输入的数据,可以使用startActivityForResult将其从DataSummary返回到DataEntry:

使用静态全局变量不起作用,因为如果在后台终止应用程序,静态全局变量将丢失


使用共享首选项,文件或数据库可能会工作,但它不是很方便,也不是很优雅(您与整个应用程序共享数据,而通过意图进行通信限制了对两个活动的数据访问)。

首先,您不应该使用
onSavedInstanceState
活动
实例之间传递信息。在活动之间共享状态有不同的方法,一种是扩展
应用程序
类并将其作为单例使用。您也可以只使用常规的单例,但是扩展
应用程序
的好处是,它的
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;
    }
}

现在,您可以在
DataEntry
活动中
setDataState
,在
DataSummary
活动中
getDataState
,使用
getInstance
方法获取应用程序的唯一实例。在
DataEntry
onCreate
方法中获取存储的值可能是个好主意,这样用户就可以看到以前输入的内容。

您能提供一个编辑示例吗?完成;-)我是动态编写的,所以可能会有一些错误(et1和et2应该是最终的,因为您在回调中引用了它们),但我认为这很容易理解。如果应用程序即使被终止也应该保留状态,这个解决方案比我提出的要好,但如果您将状态持久化到应用程序单例中,它可以作为补充。