2013-08-02 1 views
1

편집 : 더 많은 조사가 끝나면 ViewPager과 아무 관련이 없습니다. 문제는 XML에서 ViewGroup의 가시성 속성을 설정 한 다음 런타임에 변경하려고 시도하는 것입니다. 나는 원래의 질문을 그대로 남겨두고있다. 자세한 내용은 내 대답 below을 참조하십시오.보기 SetVisibility가 PagerAdapter와 작동하지 않습니다.

ViewPager 및 맞춤 PagerIndicator 클래스가있는 레이아웃이 있습니다. ViewPager의 0 번째 페이지에서 표시기를 View.GONE으로 지정합니다. 다른 페이지에서는 View.VISIBLE이되고 싶습니다.

void setupPager() { 
    mPager.setAdapter(new TutorialPagerAdapter()); 
    mPager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int currentPage) { 
      Log.d(TAG, String.valueOf(currentPage)); 
      if (currentPage == 0) { 
       mPagerIndicator.setVisibility(View.GONE); 
      } else { 
       mPagerIndicator.setVisibility(View.VISIBLE); 
      } 
      mPagerIndicator.setCurrentPage(currentPage); 

     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

mPagerIndicator은 XML 레이아웃 android:visibility="invisible"로 설정됩니다 여기 onCreate 동안이라고 내 코드입니다. 페이지 사이를 스크롤 할 때 콜백이 호출되고 페이지 번호가 정확한지 확인할 수 있습니다. 그러나 호출기가 나타나지 않습니다.

이것은 기괴한 곳입니다. SDK와 함께 제공되는 Android 계층 구조 뷰어를로드했습니다. 에뮬레이터 인 POOF에서 뷰 계층 구조를로드하면 표시기가 나타납니다. 또한 물리적 장치에서는 문제가되지 않습니다. (EDIT : 더 많은 테스트가 끝나면 버전이 높은 장치에서는 발생하지 않으므로 2.3에서는 문제가있는 것으로 나타 났지만 2.3.6 전화에서 발생합니다.)

사고? 이것이 에뮬레이터의 단점이라고 생각하는 것이 합리적일까요, 아니면 일부 장치에서는 작동하지 않을까 걱정해야합니까? 그걸 보여주기위한 해킹 이요? 계층 뷰어가하는 일은 그것이 자신을 리프레시하도록 강요 할 수 있습니까?

답변

0

표시 여부가 ViewGroups 인 Android 2.3.3 이상에 문제가있는 것으로 보입니다. ViewGroupandroid:visibility=X으로 설정하면 모든 하위 뷰의 가시성이 설정되는 것으로 보입니다. 그러나 런타임시 가시성을 변경할 때 서브 뷰에 적용되지 않습니다. 이 때문에 가시성이 gone 또는 invisibile 인 상태에서 시작하면 나중에 가시성을 설정하지 못할 수 있습니다. http://www.kittehface.com/2011/03/view-visibility-bug-on-android-233.htmlandroid setVisibility does not display if initially set to invisble

@Override 
public void setVisibility(int visibility) { 
    super.setVisibility(visibility); 
    for (ImageView image : mImages) { 
     image.setVisibility(visibility); 
    } 
} 

덕분에 내가 올바른 방향으로 지적 얻기를 위해 :

해결책은 그것뿐만 아니라 그 하위 뷰의 모든에 대한 가시성을 설정하기 위해, 내 사용자 정의보기에 setVisibility을 무시하는 것입니다.

0

"물리적 장치에서 문제가되지 않는다"는 것은 무엇을 의미합니까? 표시기가 정상적으로 표시되거나 HierarchyViewer에 표시기가 표시된다는 의미입니까?

모든 것이 내 코드에 맞게 보입니다. 귀하의 지표와 같은 소리는 ViewPager와 같은 다른보기로 덮여있을 뿐이지 만 HierarchyViewer에서 볼 수 있습니다.

위 코드를 제거하여 표시 여부를 전환 한 다음 xml에서 PagerIndicator를 View.VISIBLE으로 설정해보세요. 여전히 그것을 볼 수 없다면 문제가 있습니다.

+0

즉, 표시기는 첫 번째 페이지에서 제대로 표시되지 않고 다음 페이지에서 올바르게 표시되며 페이지를 전환 할 때 앞뒤로 전환됩니다. 모든 표시 여부 전환을 제거하면 각 페이지의 위치를 ​​볼 수 있습니다. – karl

+0

필자는 그것이 에뮬레이터 일 뿐이라고 생각했지만, 장치의 2.x에는 문제가있는 것처럼 보입니다. – karl

관련 문제