2016-06-22 2 views
0

이제 2 조각, 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

을 통해 당신은 문제를 일으키는 코드를 게시 할 필요가 먼저. – jaibatrik

+0

문제에 대한 유일한 진정한 해결책 : 다른 방향에 대해 다른 조각을 가져서는 안됩니다. 그건 안드로이드에서 일하는 방식이 아니야. –

+0

@Xaver Kapeller는 다른 결과를내는 다른 방법이 있습니다. 나는 당신이 자전하더라도 두 초상화 모두에 똑같은 것을 보여주기를 원한다. –

답변

0

당신은 두 조각의에서 onCreate() 메소드에서 setRetainInstance(True);를 호출 할 수 있습니다.

또는

는 캐시 데이터에 헤드리스 - 조각 (아무 UI와 조각)을 만들 수 있습니다.

세 번째 옵션은 onSaveInstanceState(Bundle outState)을 사용하여 데이터를 캐시하고 onCreateView() 메서드에서 Bundle savedInstanceState을 사용하여 데이터를 다시 표시하는 것입니다.

+0

첫 번째 시도는했지만 전화가 세로 레이아웃으로 돌아갈 때 시도합니다. 그것은 처음 세로 레이아웃을 파괴합니다. 그리고 헤드리스 조각의 의미는 무엇입니까? –

+0

여기의 조언은 정확하지 않습니다. 'setRetainInstance()'는 실제로 데이터를 보존 할 필요가있을 때'Fragment' 인스턴스를 유지하기 위해 데이터를 보존하지 않습니다. 이외에도 각 오리엔테이션마다 '단편화'가 다르므로 각 단락마다 단 하나만 첨부되므로 op에서 작동하지 않습니다. 'Activity'는'Fragment'의 인스턴스를 유지할 수 없습니다.UI가없는'Fragment'는 처음에는'Fragment'를 갖는 목적을 무효로합니다. 확실히하지 마십시오. 그리고 그것은 물론이 상황에서 아무것도 수정하지 않습니다. –

+0

유일한 진정한 대답은 세 번째 옵션입니다. 그리고 제대로 완료되면 대부분 자동으로 실행됩니다. 유일한 실제 솔루션은 서로 다른 방향에 대해 두 개의 다른 '조각'을 갖는 것이 아닙니다. 그게 문제의 원인입니다. –

-1

활동 회전이있을 때 활동이 닫혔다가 다시 열리면 onDestroy와 onCreate가 호출됩니다. 예를 들어

protected void onSaveInstanceState(Bundle outState) 

: 데이터를 저장하고 다른 회전에서 다시로드하려면 당신은 onSaveInstanceState 방법으로 그것을 할 수

@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 단계 : 는 onSaveInstanceState

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

3 단계로 편집 텍스트 값을 추가 하여 저장된 텍스트를 편집 값을 가져 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

관련 문제