2016-08-15 2 views
0

このクラスでは、onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドの両方をオーバーライドしています。もし私が他の活動にナビゲートした場合、、または私の装置のHomeに行きましたが、最新の状態を維持せず、新しい状態を開始しません。どのようにonSaveInstanceStateアクティビティが破棄または停止した場合でも、アクティビティの最新の状態を維持する方法

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("mylist",mAdapter); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedInstanceState.getSerializable("mylist"); 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    try { 
     ViewConfiguration config = ViewConfiguration.get(this); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if (menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception ex) { 
     // Ignore 
    } 
    //setHasOptionsMenu(true); 
    recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view); 
    if (savedInstanceState != null && savedInstanceState.getSerializable("mylist")!=null) { 

     savedInstanceState.getSerializable("mylist"); 
     update_START(); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(mAdapter); 
    }else { 
     update_START(); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(mAdapter); 
    } 
} 

すべてのボディは、私が他の活動へのコードのいずれかのブロックを追加する必要があります私は、アクティビティが破棄された場合でも、最新の状態を保つために、私の活動をinforceに追加すべきか私に言うことができますか?次のように

私onPostExecute方法は次のとおりです。

@Override 
    protected void onPostExecute(ArrayList<MovieEntity> result) { 
     mAdapter=null; 
     mAdapter = new ImagesAdapter(getBaseContext(), result); 
     recyclerView.setAdapter(mAdapter); 
    } 

これは私たManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.prof_mohamed.movieapp"> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<receiver 
    android:name=".ConnectivityReceiver" 
    android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" android:label="Pop Movies"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".DetailActivity" android:label="MovieDetail"></activity> 
</application> 

ことが想定されている私はその後、活動の間、あるいは他のアプリケーション間を移動するとき最初の実行中のアプリに戻ると、他のアクティビティやアプリへのナビゲーションを開始する前に、最新の保存済み状態を復元する必要があります。

+0

はマニフェストを投稿してください –

+0

@DavidWasser自分の投稿を編集してManifest.xmlファイルを追加しました。マニフェストファイルの現在の状態を確認してください。 –

+0

開発者のオプション「活動をしないでください」を有効にしましたか?それぞれのアクティビティで 'onDestroy()'にログを追加し、このメソッドが呼び出されているかどうか確認してください。あなたのコードやマニフェストには何も変わったものはありません。実際のデバイスやエミュレータでテストしていますか? –

答えて

-1

「の活動を保持しない」オプションが有効になって、あなたはそれが無効にする必要があり、そして今、すべてのことが実行されている、これらのメソッドの両方をオーバーライド以外の活動ナビゲーション、ホームボタン、ナビゲーション、および画面の回転で状態を保存します

@Override

保護ボイドonRestoreInstanceState(バンドルsavedInstanceState){

super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null && savedInstanceState.getSerializable("mylist")!=null) { 

     savedInstanceState.getSerializable("mylist"); 
    } 
} 

@Override 保護ボイドonRestoreInstanceState(バンドルsavedIns tanceState){

super.onRestoreInstanceState(savedInstanceState)。
savedInstanceState.getSerializable( "mylist");

}

@Override のボイドのonCreate(バンドルsavedInstanceState){

super.onCreate(savedInstanceState); 
    savedInstanceState.getSerializable("mylist"); 

}

を保護し、あなたのアプリが完全にその状態を保存ようになります...

+0

アクティビティを保持しないで今すぐ実行してください。しかし、あなたもこの事件の世話をする必要があります。このオプションは、システムがアクティビティを強制終了し、メモリを要求して再作成する場合にアプリケーションをテストするためのオプションです。それを探して、これについて勉強してください。 activtiyオプションを無効にした後に、これらのmthodをonRestoreInstanceStateとonSaveInstnaceStateというコードでデバッグする – Ramit

0

後で使用できるように状態を保存する場合は、必要なデータをsqlite dbまたは永続ストレージに書き込むことができます。このようなデザインでは、同じ状態でアクティビティを作成するために必要なすべてのデータを保存する必要があります。他にもオプションがありますが、データを永続的なストレージに保存することで、必要と安全に合ったものになります。 OnSaveInstanceStateとOnRestoreInstanceStateは、ローテーションだけでなく、メモリ要件のシステムによるアクティビティの強制終了のために、ビューの状態(xmlで定義されたIDを持つビュー)を自動的に保存します。ビューステートも保存する必要があります。すべての

+0

すみません、あなたが言うことを説明するビデオのような完全なリソースをここにコメントすることができます。ありがとう –

+0

私はたくさんのことを言ったので、明確にする必要がある部分について言及してください。私はあなたにリンクを提供することができます – Ramit

+0

私は私のrecyclerviewにイメージポスターを膨らませるためにカスタムアダプタを使用します。私は、ビューの状態や任意のものを保存するためにsqliteを使用してアクティビティとホームボタンのナビゲーション –

0

まず、あなたが正しくsavedInstanceState.getSerializable(「マイリスト」)使用されていません(入力されたデータと元のEditTextまたは選択し、チェックボックスなどのために)、あなたは保存する必要があり、変数や使用中のオブジェクトをキャストそれ:

リストリスト=(リスト)savedInstanceState.getSerializable( "mylist"); (活性が再作成、その後破棄されたときに回転に例えば)この時点で

は、バンドルのみのonCreate方法で復元され

活性ナビゲーション時や家庭にインスタンスの状態を保存するサポートするためにボタンが押されたとき(onStopを呼び出し、次にonStartを呼び出す)、同じロジックをonRestoreInstanceStateの内側のif条件に入れます。これはの後に呼び出されます。開始。開発者向けオプションで

+0

親愛なるKarim、 の場合、次の両方のロジックをonRestoreInsatnceStateの中に入れます。 1. mAdapter =(ImagesAdapter)savedInstanceState.getSerializable( "mylist"); 2. list =(ArrayList)savedInstanceState。getSerializable( "mylist"); mAdapter = new ImagesAdapter(getBaseContext()、list); 実際には意味がありませんが、状態の保存には影響しません –

+0

答えは開発者のオプションで「活動をしないでください...」ありがとう非常に –

関連する問題