1

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

用户在课堂上输入各种数据,DataEntry.java他们提交的信息显示在DataSummary.java. 这工作正常。

但是,当用户离开时,如果您返回查看您已经编写的内容DataSummary.java,则填写原始提交数据的其余信息会丢失。下面是.DataEntry.javaDS.javaDataSummary.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 中的变量以及我无法从其他方法访问它们(我想如果我知道如何做到这一点,我可以完成该方法)。

4

5 回答 5

1

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

安卓全局变量

于 2012-10-05T09:25:02.937 回答
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
于 2012-10-05T09:36:52.697 回答
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() 即可将它们取回。

于 2012-10-05T09:21:46.290 回答
0

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

为了使其工作,您必须通过 Intent 传递 DataSummary 添加的数据,而不是 saveInstanceState。为了获取在 DataSummary 中输入的数据,您可以使用 startActivityForResult 将其从 DataSummary 返回到 DataEntry:http: //developer.android.com/reference/android/app/Activity.html#StartingActivities

使用静态全局变量不起作用,因为如果应用程序在后台被杀死,静态全局变量会丢失。

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

于 2012-10-05T09:39:28.620 回答
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;
    }
}

现在您可以setDataStateDataEntry活动中,并getDataStateDataSummary活动中,获取YourApplication使用其getInstance方法的唯一实例。在 的onCreate方法中获取存储的值可能是一个想法DataEntry,因此用户可以看到之前输入的内容。

于 2012-10-05T09:40:38.430 回答