0

同じアクティビティで複数のレイアウトを呼び出すプログラムを作成していますが、レイアウトを切り替えると、スイッチの前に加えられた変更は復元されず、onSavedInstanceState(Bundle outState)は呼び出されません。手動でメソッドを呼び出そうとしましたが、バンドルを取得できませんoutState手動でonSaveInstanceState()を呼び出す方法

質問は本当にあります:選択した時点で呼び出されるアクティビティの現在の状態を取得して保存するにはどうすればよいですか?

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_contact_view); 
// more code 
} 

@Override 
public void onBackPressed() { 
    if (layoutId == R.layout.activity_contact_view) exit(); 
    else if (layoutId == R.layout.main) { 
     Toast.makeText(NsdChatActivity.this, "Successful back button action", Toast.LENGTH_SHORT).show(); 
     setContentView(R.layout.activity_contact_view); 
     refreshContactList(); 
    } 
} 

そして別々のクラスから

public void updateList(final int found) { 
    LinearLayout layxout = (LinearLayout) ((Activity)mContext).getWindow().getDecorView().findViewById(R.id.others); 
    TextView t = new TextView(mContext); 
    t.setClickable(true); 
    t.setText(found + ". " + activity.sNames.get(found)); 
    t.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    t.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //show chat view 
      activity.setContentView(R.layout.main); 
      TextView name = (TextView)activity.findViewById(R.id.clientName); 
      name.setText(activity.sNames.get(found).split(" \\(")[0]); 
      final ScrollView scroll = (ScrollView)activity.findViewById(R.id.scroll); 
      scroll.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       @Override 
       public void onFocusChange(View view, boolean b) { 
        scroll.fullScroll(View.FOCUS_DOWN); 
       } 
      }); 
     } 
    }); 
    layxout.addView(t); 
} 
+0

レイアウトを切り替えると、アクティビティが暗黙的に再作成されますか?そうでなければ、 'onSavedInstanceState(Bundle outState)'は呼び出されません。 – Enzokie

+0

私を許しますが、暗黙のうちに再現したと言ったときの意味を説明できますか?私は 'setContentView()'を使ってレイアウトを切り替えます。 – kbluue

+0

良い例:デバイスを回転させると、アクティビティが破棄されて再作成されるため、アクティビティを再作成するよう指示することはないため、暗黙のアクティビティレクリエーションになります。 – Enzokie

答えて

0

あなたは活動がによって破壊されることに脆弱になる前にAndroidがonSaveInstanceState()を呼び出しますApplication Fundamentals

で見ている必要がありかもしれませシステムではなく、ユーザーアクション(BACKキーを押すなど)によってインスタンスが実際に破棄されているときに呼び出すのは面倒ではありません

だから、同じアクティビティで複数のレイアウトを呼び出すは、上記の状況を引き起こさない可能性があります。詳細については、質問Android: Saving a state during Android lifecycleを参照してください。希望が助けてくれる!

+0

役に立ったと思うが、私はすでにそれをチェックした。私が今したいのは、私の活動の現在の状態を記録して保存できることです。 – kbluue

+0

コードを表示してください。 – duan

0

私はそれに遅れているかもしれませんが、あなたができることはあなたの状態をクラスのメンバーとして保つことです。そうすればいつでも状態を復元できます。

Bundle mState; 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the state 
    savedInstanceState = mState; 
    super.onSaveInstanceState(savedInstanceState); 
} 
@Overrite 
public void onRestoreInstanceState(Bundle savedInstance){ 
    mState = savedInstance; 
    Restore(); 
} 

public void Restore(){ 
    //access your state and restore 
} 

また、ビューを切り替えるにはsetContentViewを使用しないでください。これは高価な方法です。あなたはViewSwitcherまたはViewFlipperか、またはFragmentsを実装するために何らかのチェックをしたいかもしれません。

関連する問題