web-dev-qa-db-ja.com

onSaveInstanceStateの例を使用してください

状態を保存することになると混乱します。そのため、アクティビティが破棄される直前に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);
    }
}
101
tj walker

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();
    }
}

保存したメッセージは画面に乾杯されます。お役に立てれば。

179
Spidy

すべての新しいAndroid開発者が知っておくべき重要な注意点の1つは、IDを割り当てる限り、ウィジェットの情報(TextView、ボタンなど)はAndroidによって自動的に保持されることです。それら。つまり、ほとんどのUI状態は問題なく処理されます。他のデータを保存する必要がある場合にのみ、これが問題になります。

Android Docs から:

必要な作業は、状態を保存する各ウィジェットに一意のID(Android:id属性付き)を提供することだけです。ウィジェットにIDがない場合、その状態を保存できません

32
Keith Adler

良い情報:BundleオブジェクトがnullであるかどうかをonCreate()メソッドで確認する必要はありません。システムがonStart()メソッドの後に呼び出すonRestoreInstanceState()メソッドを使用します。システムは、復元する保存済み状態がある場合にのみonRestoreInstanceState()を呼び出すため、Bundleがnullであるかどうかを確認する必要はありません。

5
Diego Souza

店舗情報:

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);
}
3
Klatschen

データが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
    }
}
0
Mathan Chinna

これは追加情報です。

このシナリオを想像してください

  1. ActivityAはActivityBを起動します。
  2. ActivityBは新しいActivityAPrimeを起動します

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
    
  3. ActivityAPrimeはActivityAとは関係ありません。
    この場合、ActivityAPrime.onCreate()のバンドルはnullになります。

ActivityAとActivityAPrimeが異なるアクティビティではなく同じアクティビティである場合、ActivityBはstartActivity()を使用するよりもfinish()を呼び出す必要があります。

0
ken

基本的に、onSaveInstanceState(Bundle outBundle)はバンドルを提供します。 Bundleクラスを見ると、さまざまなものをその中に配置できることがわかります。 onCreate()の次の呼び出しで、そのバンドルを引数として戻すだけです。その後、値を再度読み取り、アクティビティを復元できます。

EditTextを使用したアクティビティがあるとします。ユーザーはその中にテキストを書きました。その後、システムはonSaveInstanceState()を呼び出します。 EditTextからテキストを読み取り、Bundle.putString( "edit_text_value"、theValue)を介してバンドルに書き込みます。

これで、onCreateが呼び出されます。提供されたバンドルがヌルではないかどうかを確認します。その場合は、Bundle.getString( "edit_text_value")を使用して値を復元し、EditTextに戻すことができます。

0
user658042