2012-07-23 2 views
2

2 개의 레이아웃이 있습니다.setContentView()는 레이아웃을 전환하기에 충분하지 않습니까?

첫 번째로드 (WebView) 프로그램을 시작할 때 벌금.

제 2 하나는로드 (간단한 레이아웃), 사용자가 메뉴 항목을 선택하면 벌금 :

setContentView(R.layout.simple); 
LinearLayout ll = (LinearLayout) findViewById(R.id.simple_layout); 

는 않는 모든 백그라운드에서 무언가를 처리하는 동안 화상을 표시 인이. 처리가 끝나면 처리기를 통해 가려진 WebView로 다시 전환하려고 시도합니다.

setContentView(R.layout.main); 

스위칭이 발생하는 것 같습니다하지만 웹보기는 입니다.

왜 그럴까요? setContentView() 스위치가 2 번째로 잘 작동 했으므로 첫 번째 레이아웃으로 다시 전환 할만큼 충분하지 않습니까?

+1

새로운 활동을 만들지 않고 동적으로 전환하려면 조각을 사용하십시오. 하나의 조각 - 하나의 레이아웃. 그래서 당신의 하나의 활동은 "파리"(시간당 한 번)에 2 조각을 가지고 있습니다. 조각을 사용하는 방법은 다음을 참조하십시오. http://developer.android.com/guide/components/fragments.html –

+0

@VladimirLichonos 팁 주셔서 감사합니다. 조각이 Android 2.2와 호환되는가요? –

+0

또는 Inflater를 사용하여 원하는 뷰를 팽창시킨 다음 원하는 경우 언제든지 setContentView를 사용할 수 있습니다. –

답변

2

여기에서 주된 문제는 setContentView()를 여러 번 (주석에 표시된대로) 호출하면 안된다는 것입니다. 단편은 좋은 생각이지만 두 화면 사이를 전환하려는 경우 ViewFlipper을 사용할 수도 있습니다. 예 http://blog.kerul.net/2011/07/viewflipper-examplea-simple-flashcard.html

Button next,previous; 
    ViewFlipper vf; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     next = (Button) findViewById(R.id.Button01); 
     previous = (Button) findViewById(R.id.Button02); 
     next.setOnClickListener(this); 
     previous.setOnClickListener(this); 
     vf=(ViewFlipper)findViewById(R.id.ViewFlipper01); 
    } 

    //@Override 
    public void onClick(View v) { 
     if (v == next) { 
      vf.showNext(); 
     } 
     if (v == previous) { 
      vf.showPrevious(); 
     } 
    } 
} 

당신의 화면이 비어있는 이유 당신이해야하기 때문이다에서 가져온 다시 웹뷰를 다시 초기화하기. setContentView()를 여러 번 호출하면 findViewByIds와 그 모든 것을 다시 가져와야합니다. 목록보기가 포함되어 있습니다.

+0

저는 웹뷰를 다시 초기화해야하는 것에 대해 당신이 맞다고 생각합니다. 필자가 이전에 떠난 웹뷰의 이전 상태로 되돌리고 싶기 때문에, 웹뷰를 다시 초기화하고 싶지는 않습니다. ViewFlipper 접근 방식은 매력처럼 작동합니다. 수락. –

+0

감사합니다. 다행히 도울 수있다 –

4

나는이 방법을 사용하십시오 메인 프로그램에서 :에서 onCreate에서

private LinearLayout mainview; 
private LinearLayout playerview; 

:

다음
LayoutInflater inflater = LayoutInflater.from(this); 
setContentView(R.layout.main); 
mainview = (LinearLayout) this.findViewById(R.id.main); 
playerview = (LinearLayout) inflater.inflate(R.layout.player, null); 

당신은

setContentView(mainview); 

setContentView(playerview); 
를 호출 할 수 있습니다 원하는 경우 언제든지

필요한 것은 각 레이아웃에 대해 하나씩 두 개의 레이아웃 xml 파일입니다. 이는 단편이나 다른 방법보다 훨씬 간단합니다.

무엇보다도 나는 처음부터 메인 뷰를 팽창시킬 필요가 없으며 다른 것들만 팽창시킬 필요가 없습니다. 제 생각에는 setContentView()가 호출 될 때 뷰를 확장해야하기 때문입니다.

+0

나는 당신의 접근 방식을 좋아하지만'mainview'는 어디에서 초기화합니까? –

+0

이 방법은보기간에 앞뒤로 전환 할 때 각보기의 모든 필드가 보존되므로 보너스가 추가되므로 사용자 입력 등이 있으면 손실되지 않습니다. 전환 할 때마다 조회수를 다시 초기화하면 새로운 정보를 직접 저장해야합니다. 필요에 따라 LinearLayout 참조를 WebView 등으로 전환하는 것을 잊지 마십시오. –

+0

죄송합니다. 게시 한 코드에 문제가 있습니다. 'playerview' 로의 전환은 정상적으로 작동하지만, 되돌리기 전환은'IllegalStateException : 지정된 자식이 이미 부모를가집니다. 자식의 부모에서 먼저 removeView()를 호출해야합니다. ' –

관련 문제