2012-02-23 4 views
1

화면 방향이 바뀌면 단편에 문제가 있습니다. 내 코드에서 화면 방향에 따라 다른 레이아웃 xml을 만들었습니다. 예를 들어, 레이아웃 디렉토리에 header_landscape.xml 및 header_portrait.xml이 있습니다. 각각의 다른 머리글은 선형 레이아웃에서 동일한 단편을 가지고 있습니다. 그래서 내 장치를 돌릴 때, 나는 "중복 ID ..."오류가 내 조각에 해당합니다.조각 || onConfigurationChanged || Duplicate

레이아웃의 차이는 콘텐츠입니다. 내가 "풍경"에있을 때 나는 "초상화"에있는 것보다 많은 정보를 표시합니다.

에 내 활동의 생성 :

setContentView(R.layout.main_landscape); 

       //header 
       date=(TextView)findViewById(R.id.headerLandscapeDate); 
       routeSens=(TextView) findViewById(R.id.headerLandscapeRouteSens); 
       pkHeader=(TextView) findViewById(R.id.headerLandscapePk); 

       //Récupération de la listview créée dans le fichier main.xml 
       maListViewPerso = (ListView) findViewById(R.id.ListeChoix);  

       //On attribut à notre listView l'adapter que l'on vient de créer 
       maListViewPerso.setAdapter(chargeMenu()); 

$ 배치 할 때 방향 화면 변경의 수정의 코드입니다.

public void onConfigurationChanged(Configuration newConfig) 
{ 
     super.onConfigurationChanged(newConfig); 


     // Checks the orientation of the screen 
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE && isLoaded && oldScreenStateOrientation!=newConfig.orientation) 
     { 

      setContentView(R.layout.main_landscape); 

      //header 
      date=(TextView)findViewById(R.id.headerLandscapeDate); 
      routeSens=(TextView) findViewById(R.id.headerLandscapeRouteSens); 
      pkHeader=(TextView) findViewById(R.id.headerLandscapePk); 

      maListViewPerso = (ListView) findViewById(R.id.ListeChoix); 
      //On attribut à notre listView l'adapter que l'on vient de créer 
      maListViewPerso.setAdapter(chargeMenu()); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT && isLoaded && oldScreenStateOrientation!=newConfig.orientation) 
     { 

      setContentView(R.layout.main_portrait); 


      routeSens=(TextView) findViewById(R.id.headerPortraitRouteSens); 
      pkHeader=(TextView) findViewById(R.id.headerPortraitPk); 

      maListViewPerso = (ListView) findViewById(R.id.ListeChoix); 
      //On attribut à notre listView l'adapter que l'on vient de créer 
      maListViewPerso.setAdapter(chargeMenu()); 
     } 
     } 

누구나 해결책이있는 경우. api8 (호환 라이브러리 조각)을 사용하여 개발했습니다.

죄송합니다.

감사

답변

1

당신은 안드로이드가 모든 구성을위한 전환을 할 수 있도록해야한다! "onConfigurationChanged"에서 아무 것도하지 않으면 매니페스트의 모든 구성 변경 사항을 제거하십시오! (main.xml에을 :

그들이 모두 이름이 있는지 확인 레이아웃/폴더

에 세로 레이아웃을 넣고/폴더

레이아웃 땅에 가로 레이아웃을 넣어 또는 무엇이든간에 동일 함)

그런 다음 귀하의 활동에서.을 작성하십시오. 다음과 같이하십시오 :

이 방법을 사용하면 안드로이드가 사용할 구성을 걱정할 수 있습니다. 큰 화면에 가로보기 만 표시하려면 layout-w1024dp과 같은 폴더에 넣을 수 있습니다. 이렇게하면 여러 레이아웃을 매우 쉽게 만들 수 있습니다.

+0

당신은 내가 모든 레이아웃을 복제하고이 개 폴더를 레이아웃 (레이아웃 토지와 레이아웃 포트를 작성해야한다는 것을 의미하지만 조각이 배치는 서로 다른 두 가지에 나타납니다 주셔서 감사합니다나요? – Jazys

+0

솔루션을 사용해 보았지만 머리말이 "초상화"와 "풍경"에서 어떻게 같습니까? – Jazys

+0

잘 작동하지만 작업이 다시 시작되고 구성이 손실됩니다. 데이터와 객체를 가지고 있다면, 모든 데이터를 복원 할 수있는 방법이 있습니까? – Jazys

3

어떤 이유로 든 방향 변경을 처리해야하는 경우 setContentView()를 호출하기 전에 조각을 제거해야합니다. 여기에 내 경우에는 근무 코드는 다음과 같습니다

@Override 
    public void onConfigurationChanged(final Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // We must remove the fragment, otherwise we get a duplicate ID error when the 
     // onCreateView() method is executed. 
      final FragmentManager fm = this.getSupportFragmentManager(); 
     ExtrasFragment ef = (ExtrasFragment) fm.findFragmentByTag(ExtrasFragment.FRAGMENT_TAG); 
     if(ef != null) { // for small screens the fragment is not embedded in this activity 
      final FragmentTransaction ft = fm.beginTransaction(); 
      ft.remove(ef); 
      ft.commit(); 
      ef = null; 
      fm.executePendingTransactions(); 
     } 
     this.setContentView(R.layout.main); // contains the ExtrasFragment 
    ... 
}