0

데이터를 온라인으로 검색하는 데 사용되는 AsyncTask의 결과에 따라 표시하거나 숨길 수있는 setVisibility()가있는 두 개의 기본보기가있는 조각을 사용하고 있습니다.조각을 올바르게 복원 할 수 없습니다. 회전시보기

private void switchView() 
{ 
    Log.d(LOG_TAG, "switchView(): show = " + show); 
    mListView.setVisibility(show ? View.VISIBLE : View.GONE); 
    searchView.setVisibility(show ? View.GONE : View.VISIBLE); 
    mCompanyArrayAdapter.notifyDataSetChanged(); 
} 

AsyncTask를이 완료 될 때 래퍼 클래스에 데이터를 구문 분석하고 이들의 ArrayList를을 만들 수 있도록 내가이 방법을 취하고 : 예를 들어

, 여기에보기 사이를 전환 할 수있는 방법이다 ListView 어댑터에서 사용할 개체. (다른 단편에 사용자 정의 클래스를 전달하는 다른 방법이 있다면 사용하는 것이 가능합니다.)

결과가 async에서 일단 나오면 searchView가 숨겨지고 mListView가 표시됩니다. 그러나 회전시 화면은 mListView 결과를 계속 표시하는 대신 searchView로 돌아갑니다.

10-17 10:29:21.872 6603-6603/nz.co.exium.panther D/DiscoverFragment﹕ onCreateView: savedinstancestate is null = false 
10-17 10:29:21.877 6603-6603/nz.co.exium.panther D/AbsListView﹕ Get MotionRecognitionManager 
10-17 10:29:21.882 6603-6603/nz.co.exium.panther D/DiscoverFragment﹕ onCreateView: savedinstancestate is null = true 

그래서 첫 번째 쇼를 savedInstanceState가 발견된다 :

은 내가, 같은 조각에서 onCreateView를 두 번 호출 (DiscoverFragment)에 믿고 여기에 본 것을 보여줍니다 로그 출력에 의해 혼란 스러워요! = null이며 부울 값을 적절하게 설정하지만 다른 onCreateView()가 호출되면 savedInstanceState는 null이고 다시 false로 설정됩니다. 회전 후 double onCreateView()가 왜 필요합니까?

도움 주셔서 감사합니다.() 내 MainActivity.onCreate에서 :

getFragmentManager().beginTransaction() 
        .replace(R.id.content_frame, Fragment.instantiate(
          getApplicationContext(), mClasses[position])) 
        .commit(); 

합니다 (content_frame 위치 == DrawerLayout 위치 항목에 대한 FrameLayout이 사용) MainActivity에 조각을 대체

요청으로

코드 :

if (savedInstanceState == null) { 
     selectItem(0); 
    } else if (placeID == null || placeID.isEmpty()) { 
     selectItem(savedInstanceState.getInt(SELECTED_KEY)); 
    } else { 
     selectItem(2); 
    } 

null이 기본 조각을 설정하면 이미 이전 savedInstanceState에 대한 검사를 수행합니다. BroadcastReceiver의 변수 placeID가 null/empty이면 이전 상태로 복원하십시오. 그렇지 않으면 Notifications 데이터를 표시 할 Fragment로 이동하십시오.

+0

액티비티에 조각을 추가하는 코드를 추가 할 수 있습니까? (XML로 ''이 아닌 프로그래밍 방식으로 추가한다고 가정)? – ianhanniballake

+0

예, DrawerLayout을 사용하는 selectItem (int position) 메서드는 질문에 추가 한 코드를 사용하여 content_frame의 조각을 전환합니다. – fakataha

+0

그러면 조각의 표시를 위해 액티비티의'onCreate()'에서 어떤 일이 발생합니까? – ianhanniballake

답변

1

파편의 구성 변경을 지정하여 오락 활동을 방지 할 수있다. 따라서 savedInstanceState == null 일 때만 selectItem()으로 전화해야합니다. 그렇지 않으면 복원 된 상태의 조각을 가져온 다음 즉시 새 상태로 대체합니다 (복원 된 상태 없음).

+0

예, 회전 할 때 상태를 복원하려고 불필요한 코드가있는 것처럼 보입니다. 그 fragment가 올바른 savedState를 검색 할 수 있도록 두 번째 조건을 제거합니다. 도와 주셔서 감사합니다! – fakataha

0

그럼, 여기 일이 이것이다 :

  • 귀하의 활동이 작성되고, 하나 개의 조각이
  • 당신은 이전에 조각과 함께 (
  • 귀하의 활동이 다시됩니다 장치를 회전이 추가됩니다 추가됨), onCreate에서 새로운 조각을 추가합니다. 즉, 활동에 두 조각이 추가되었습니다.

가장 쉬운 방법은 귀하의 활동을 점검하는 것입니다 Y :

if (savedInstanceState == null){ // add fragment } 

다른 방법은 자동 상태를 복원의 일부로서 회전에 재현하여 AndroidManifest.xml을

관련 문제