状態を保存することになると混乱します。そのため、アクティビティが破棄される直前にonSaveInstanceState(Bundle)
が呼び出されることを知っています。しかし、どのようにして情報を保存し、onCreate(Bundle savedInstanceState)
の元の状態に戻すのでしょうか?このバンドルが情報を復元する方法がわかりません。誰かが例を提供できると助かります。開発者ガイドはこれをうまく説明できません。
public class Conversation extends Activity {
private ProgressDialog progDialog;
int typeBar;
TextView text1;
EditText edit;
Button respond;
private String name;
private String textAtView;
private String savedName;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dorothydialog);
text1 = (TextView)findViewById(R.id.dialog);
edit = (EditText)findViewById(R.id.repsond);
respond = (Button)findViewById(R.id.button01);
if(savedInstanceState != null){
savedInstanceState.get(savedName);
text1.setText(savedName);
}
else{
text1.setText("Hello! What is your name?");
respond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
name = edit.getText().toString();
text1.setText("Nice to meet you "+ name);
}
});
}
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString(savedName, name);
}
}
Bundle
は、保存するすべての情報のコンテナです。 put *関数を使用して、データを挿入します。以下は、Bundle
にデータを保存するために使用できるput関数の短いリストです(他にもあります)。
putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)
onCreate
関数では、このBundle
がプログラムに返されます。アプリケーションがリロードされているか、初めて起動されたかを確認する最良の方法は次のとおりです。
if (savedInstanceState != null) {
// Then the application is being reloaded
}
データを取り戻すには、put *関数と同様にget *関数を使用します。データは名前と値のペアとして保存されます。これはハッシュマップのようなものです。キーと値を指定し、値を戻したいときにキーを指定すると、関数が値を取得します。以下に簡単な例を示します。
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("message", "This is my message to be reloaded");
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String message = savedInstanceState.getString("message");
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
保存したメッセージは画面に乾杯されます。お役に立てれば。
すべての新しいAndroid開発者が知っておくべき重要な注意点の1つは、IDを割り当てる限り、ウィジェットの情報(TextView、ボタンなど)はAndroidによって自動的に保持されることです。それら。つまり、ほとんどのUI状態は問題なく処理されます。他のデータを保存する必要がある場合にのみ、これが問題になります。
Android Docs から:
必要な作業は、状態を保存する各ウィジェットに一意のID(Android:id属性付き)を提供することだけです。ウィジェットにIDがない場合、その状態を保存できません
良い情報:BundleオブジェクトがnullであるかどうかをonCreate()メソッドで確認する必要はありません。システムがonStart()メソッドの後に呼び出すonRestoreInstanceState()メソッドを使用します。システムは、復元する保存済み状態がある場合にのみonRestoreInstanceState()を呼び出すため、Bundleがnullであるかどうかを確認する必要はありません。
店舗情報:
static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
OnCreate-Methodの情報を復元したくない場合:
以下に例を示します。 アクティビティの再作成
OnCreate()中に状態を復元する代わりに、onRestoreInstanceState()を実装することを選択できます。これは、システムがonStart()メソッドの後に呼び出します。システムは、復元する保存済み状態がある場合にのみonRestoreInstanceState()を呼び出すため、Bundleがnullであるかどうかを確認する必要はありません。
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
データがsavedInstanceState
からロードされない場合、次のコードを使用します。
問題は、URL呼び出しが完全に完了しないため、データがロードされているかどうかを確認し、instanceState値を表示することです。
//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
mAlreadyLoaded = true;
GetStoryData();//Url Call
} else {
if (listArray != null) { //Data Array From JsonArray(ListArray)
System.out.println("LocalData " + listArray);
view.findViewById(R.id.progressBar).setVisibility(View.GONE);
}else{
GetStoryData();//Url Call
}
}
これは追加情報です。
このシナリオを想像してください
ActivityBは新しいActivityAPrimeを起動します
Intent intent = new Intent(getApplicationContext(), ActivityA.class);
startActivity(intent);
ActivityAPrimeはActivityAとは関係ありません。
この場合、ActivityAPrime.onCreate()のバンドルはnullになります。
ActivityAとActivityAPrimeが異なるアクティビティではなく同じアクティビティである場合、ActivityBはstartActivity()を使用するよりもfinish()を呼び出す必要があります。
基本的に、onSaveInstanceState(Bundle outBundle)はバンドルを提供します。 Bundleクラスを見ると、さまざまなものをその中に配置できることがわかります。 onCreate()の次の呼び出しで、そのバンドルを引数として戻すだけです。その後、値を再度読み取り、アクティビティを復元できます。
EditTextを使用したアクティビティがあるとします。ユーザーはその中にテキストを書きました。その後、システムはonSaveInstanceState()を呼び出します。 EditTextからテキストを読み取り、Bundle.putString( "edit_text_value"、theValue)を介してバンドルに書き込みます。
これで、onCreateが呼び出されます。提供されたバンドルがヌルではないかどうかを確認します。その場合は、Bundle.getString( "edit_text_value")を使用して値を復元し、EditTextに戻すことができます。