2012-06-08 4 views
0

내 레이아웃에 TextViews를 추가하고 있으며 화면 방향이 바뀌면 계속 유지하려고합니다.오리엔테이션 변경 후보기 복원

다음 코드를 시도했지만 작동하지 않습니다. java.lang.IllegalStateException :

에 의해 발생 :

public class DetailsActivity extends Activity { 

    private HashMap<View, TextView> views = new HashMap<View, TextView>();; 

    @Override 
    public Object onRetainNonConfigurationInstance() {  
     return views; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.layout44); 

     findViewById(R.id.layout44_11).setOnLongClickListener(onLongClickListener); 
     ... 

     HashMap<View, TextView> data = (HashMap<View, TextView>)this.getLastNonConfigurationInstance(); 

     if (data == null) { 
      System.out.println("is null"); 
     } else { 
      for(View key : data.keySet()) { 
       ViewGroup parent = (ViewGroup) key; 
       System.out.println(key + " " + data.get(key)); 

       System.out.println(parent.getChildCount()); 
       System.out.println("child: " + parent.getChildAt(0));; 

       parent.removeView(data.get(key)); 
       data.get(key).setText("asd"); 
       data.get(key).setVisibility(View.VISIBLE); 
       parent.addView(data.get(key)); 
      } 
      System.out.println("-------------------"); 
     } 
    } 

    private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      ViewGroup parent = (ViewGroup) v; 
      if(parent != null) { 
       TextView tv = new TextView(getApplicationContext()); 
       tv.setText("TextView"); 
       views.put(parent, tv); 
       parent.addView(tv); 
      } 
      return false; 
     } 
    }; 
} 

나는 예외를 받고 있어요 지정된 아이 이미 부모가. 먼저 부모의 부모 인 에서 removeView()를 호출해야합니다.

왜? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 그것을 해결하는 방법?

+0

내 레이아웃에 TextViews를 추가하고 있으며 화면 방향이 바뀌면 계속 유지하려고합니다. >>>> 어쨌든 그들은 화면에 남아 있습니다. 정확히 원하는 것은 무엇입니까 ?? –

+0

첨부 된 코드에서 볼 수 있듯이 레이아웃에 TextViews를 추가하고 있습니다. 화면 방향을 변경하면 사라집니다. 나는 그들을 지키고 싶다. 또한 세로와 가로의 두 가지 레이아웃이 있지만 오류의 원인인지는 알 수 없습니다. – Ziem

답변

3

화면 방향을 변경할 때 수행중인 작업은 활동을 삭제 한 다음 다시 새로 시작하는 것입니다.

onCreate() 메소드에 10 개의 TextView를 추가했다면, 아무런 개입없이 이전과 똑같은 방식으로 추가됩니다. 걱정하지 마십시오.

그러나 활동에 사용자 입력이 있거나 활동이 상태 저장으로되어있는 경우 (활동에 단추 누름 또는 데이터 제출이 있음) 모든 상태 정보를 저장하려면 onSavedInstanceState(Bundle out)을 사용해야합니다 (기본 유형 , NOT 조회) 그리고 onCreate()에서이 정보를 번들 밖으로 가져 와서 상태를 다시 만들 수 있습니다.

패스 Views 주위의 활동 (또는 오리 엔테이션 변경 사이). 조회수는 활동에 의해 소유되며 조회수가 지나가고 원래 활동을 가져옵니다.

당신이 안드로이드를 처음 사용하는 사람이라면 다음과 같이 생각하십시오 : 당신이 아트 갤러리에 있고 건물이 찢어 지려하고 새로운 미술관이 지어 질 것입니다 (당신은 풍경에서 초상화로 전환합니다) 그러면 First Gallery에서 모든 미술 작품을 가져 와서 새로운 Gallery에 넣을 수 있습니다. 첫 번째 갤러리에서 Wall (Views)을 찢어 두 번째 갤러리를 만들지 않고 두 번째 갤러리를 만든 다음 새 갤러리의 벽 (Views)에 아트를 매달겠습니다.

+0

토지 레이아웃을 정의했기 때문에 화면 방향을 변경 한 후에 뷰가 추가되지 않습니다. 이전 질문 참조 : http://stackoverflow.com/questions/10913248/rotating-views-but-not-layouts-on-screen-orientation-change – Ziem

관련 문제