1

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で変数を使用する方法を理解するのは難しく、別のメソッドから変数にアクセスできません(これを行う方法を知っていれば、メソッドを完成させることができると思います)。

4

5 に答える 5

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に書き込むだけです。

編集:例

EditTexts et1とet2が2つあり、それらが格納する値が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()を呼び出してそれらを取り戻す必要があります。

于 2012-10-05T09:21:46.290 に答える
1

アプリケーション全体でグローバル変数を使用する方法を明確に説明しているこの投稿をご覧になることをお勧めします。

Androidグローバル変数

于 2012-10-05T09:25:02.937 に答える
0

私が正しく理解していれば、あなたは2つの活動の間で共有したいグローバルな状態を持っています。この問題をsavedInstanceStateで処理することはできません。これは、DataSummaryからDataEntryに戻ってから、もう一度DataSummaryに進むと、新しいDataSummaryは別のインスタンスであり、以前に保存したsavedInstanceStateを取得しないためです。

それを機能させるには、savedInstanceStateではなく、インテントを介してDataSummaryによって追加されたデータを渡す必要があります。DataSummaryに入力されたデータを取得するには、startActivityForResultを使用してDataSummaryからDataEntryにデータを返すことができます:http: //developer.android.com/reference/android/app/Activity.html#StartingActivities

アプリケーションがバックグラウンドで強制終了されると静的グローバル変数が失われるため、静的グローバル変数の使用は機能しません。

共有設定を使用すると、ファイルまたはデータベースが機能する場合がありますが、あまり便利ではなく、あまり洗練されていません(データをアプリケーション全体と共有しますが、インテントを介して通信すると、2つのアクティビティへのデータアクセスが制限されます)。

于 2012-10-05T09:39:28.620 に答える
0

手始めに、インスタンスonSavedInstanceState間で情報を渡すためにを使用するべきではありません。Activityアクティビティ間で状態を共有する方法はいくつかあります。1つは、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アクティビティとアクティビティで、そのメソッドを使用する唯一のインスタンスを取得できます。のメソッドで保存された値を取得して、ユーザーが以前に入力された内容を確認できるようにすることをお勧めします。getDataStateDataSummaryYourApplicationgetInstanceonCreateDataEntry

于 2012-10-05T09:40:38.430 に答える