2016-06-22 6 views
0

私は今、2つの断片、1つの断片の肖像画モード、もう1つのハンドル風景モードを持っています。しかし、問題は、ポートレートからランドスケープへと回転し、次にポートレートに戻るときです。最初のポートレートモードで表示されているのと同じことは表示されません。この問題を解決できるコードはありますか?フラグメントを使用して方向変更を処理する方法は?

このコードは、断片ホルダ内にある:

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

    FragmentManager fm = getSupportFragmentManager(); 

    final Fragment fragment = Frag.newInstance(); //Portrait layout 
    final Fragment fragment2 = Frag2.newInstance(); //Landscape layout 

    int orientation = getResources().getConfiguration().orientation; //check whether is it portrait or landscape 


    if(orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Fragment fragTAG = fm.findFragmentByTag(TAG_P); 
     if(fragTAG == null){ 
      Log.i("test","test"); 
       fm.beginTransaction() 
         .replace(R.id.fragPlaceHolder, fragment, TAG_P) 
         .commit(); //Portrait 
     } 
     else{ 
      fm.beginTransaction().replace(R.id.fragPlaceHolder,fragTAG).commit(); 
     } 

    } 
    if(orientation == Configuration.ORIENTATION_LANDSCAPE){ 
     Fragment fragTAG = fm.findFragmentByTag(TAG_L); 
     if(fragTAG == null){ 
       fm.beginTransaction() 
         .replace(R.id.fragPlaceHolder, fragment2, TAG_L) 
         .commit(); //Landscape 
     } 
     else{ 
      fm.beginTransaction().replace(R.id.fragPlaceHolder,fragTAG).commit(); 
     } 
    } 

} 

}

+0

を通じて保存されたエディットテキストの値を取得します。 onSaveInstanceState

@Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence(KEY_TITLE, et_text.getText().toString()); } 

ステップ3へのあなたの編集テキスト値を追加します。最初。 – jaibatrik

+0

あなたの問題に対する唯一の真の解決策は、異なる方向の異なるフラグメントを持つべきではありません。それは、Android上で動作するものではありません。 –

+0

@ Xaver Kapellerは、他の方法でこれを行うことができます。同じ結果が出てきます。私はちょうどあなたが回転しても両方の肖像画に同じことを表示したい。 –

答えて

0

両方のフラグメントでのonCreate()メソッドでsetRetainInstance(True);を呼び出すことができます。データをキャッシュするためにヘッドレス・フラグメント(UIなしでフラグメント)を作成するための

それとも

3番目のオプションは、Bundle savedInstanceStateをonCreateView()メソッドで使用してデータをキャッシュし、データを再表示するために、onSaveInstanceState(Bundle outState)を使用することです。

+0

私は最初のものを試してみましたが、電話機がポートレートのレイアウトに戻って回転しています。これは初めてのポートレイトレイアウトを破壊します。そして、あなたはヘッドレスの断片の意味ですか? –

+0

こちらのアドバイスはどれも正しいものではありません。 'setRetainInstance()'は、データを保存するのではなく、実際にそれを行う必要があるときに 'Fragment'インスタンスを保持するためのものです。これとは別に、これはopには機能しません。なぜなら、彼はそれぞれの方向に対して異なる 'Fragment'を持っていて、おそらくそれぞれのために1つしか付けられていないからです。 'Activity'は' Fragment'のインスタンスを保持できません。UIを持たない 'Fragment'は最初に' Fragment'を持つという目的を破っています。間違いなくそれをやってください。もちろん、このような状況では何も修正されません。 –

+0

唯一の本当の答えはあなたの3番目の選択肢です。そして、これがうまくいけば、これは大抵の場合自動的に起こります。唯一の実際の解決策は、異なる方向に対して2つの異なる「フラグメント」を持たないことです。それが最初に問題を引き起こしているのです。 –

-1

アクティビティローテーションがある場合、アクティビティは閉じられ、onDestroyとonCreateが再度呼び出されます。 あなたはデータを保存し、onSaveInstanceState方法でそれを行うことができ、他の回転でそれをリロードする場合:例えば

protected void onSaveInstanceState(Bundle outState) 

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("name", "David"); 
    outState.putInt("age", 17); 
} 

とのonCreate

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    … 
    if(savedInstanceState != null) 
    { 
     savedInstanceState.getString("name"); 
     savedInstanceState.getInt("age"); 
    } 
} 
内のデータをリロード
3

手順1: アクティビティの設定変更を追加します。

<activity android:name=".ui.createtasks.CreateTaskActivity" 
     android:configChanges="orientation|screenSize|keyboardHidden" > </activity> 

ステップ2: あなたが問題を引き起こしたコードをポストする必要がonViewStateRestored

@Override 
public void onViewStateRestored(@Nullable Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 

    String savedTitle = null; 
    if (savedInstanceState != null) { 
     savedTitle = savedInstanceState.getString(KEY_TITLE); 
     et_text.setText(savedTitle); 

    } 

} 
+0

申し訳ありませんマニフェストがアクティビティではありません(ステップ1:アクティビティのコンフィグレーション変更を追加してください) ステップ1:マニフェストのコンフィグレーションの変更を追加する – Sanaullah

関連する問題