Android ViewPager는 현재보기를 가져옵니다.
ViewPager가 있고 위치가 아닌 현재 선택되고 표시되는 뷰를 얻고 싶습니다.
getChildAt(getCurrentItem)
잘못 반환View
이것은 항상 작동하지 않습니다. 때로는 null을 반환하고 때로는 잘못된 View를 반환합니다.
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser == true) { mFocusedListView = ListView; } }
에 PageListener
ViewPager
와getChildAt()
도마다 나에게 올바른보기를 포기하지 않을, 작동하지 않습니다.
현재 보이는보기를 얻으려면 어떻게해야합니까?
View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
나는 그것을 알아 냈다. 내가 한 일은 전화를했다 setTag()
모든 이름으로 View
S / ListView
S, 그냥 전화 findViewWithTag(mytag)
, mytag
태그되고.
불행히도이 문제를 해결할 다른 방법은 없습니다.
방금 동일한 문제를 발견하고 다음을 사용하여 해결했습니다.
View view = MyActivity.mViewPager.getFocusedChild();
어댑터를 호출하여 itens 목록에 액세스하여 현재 요소를 가져올 수 있습니다. myAdapter.yourListItens.get(myViewPager.getCurrentItem());
보시다시피 ViewPager는 어댑터 요소 (현재 페이지)의 현재 색인을 검색 할 수 있습니다.
FragmentPagerAdapter를 사용하는 경우 다음 캐스트를 수행 할 수 있습니다.
FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();
그리고 전화
adapter.getItem(myViewPager.getCurrentItem());
이것은 나를 위해 매우 잘 작동합니다.)
안드로이드 뷰를 꾸미는 방법을 찾기 위해 노력하는 동안 내 블로그에 문서화 한 OP의 문제에 대한 대체 솔루션을 정의했다고 생각 합니다. 여기에 모든 것을 포함하기에는 코드가 너무 많은 것 같아서 링크하고 있습니다.
내가 제안하는 해결책 :
- 어댑터와보기를 완전히 분리 된 상태로 유지합니다.
- 뷰 페이저에서 어떤 인덱스를 사용하여 뷰를 쉽게 쿼리 할 수 있으며이
null
뷰가 현재로드되지 않았거나 해당 뷰가 있으면 반환됩니다 .
PagerAdapter를 확장하는 어댑터를 사용하고 PagerAdapter 내에서 setPrimaryItem 메서드를 재정의합니다.
https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html
class yourPagerAdapter extends PagerAdapter
{
// .......
@Override
public void setPrimaryItem (ViewGroup container, int position, Object object)
{
int currentItemOnScreenPosition = position;
}
// .......
}
나는이 방법을 android.support.v4.view.ViewPager
View getCurrentView(ViewPager viewPager) {
try {
final int currentItem = viewPager.getCurrentItem();
for (int i = 0; i < viewPager.getChildCount(); i++) {
final View child = viewPager.getChildAt(i);
final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();
Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
f.setAccessible(true);
int position = (Integer) f.get(layoutParams); //IllegalAccessException
if (!layoutParams.isDecor && currentItem == position) {
return child;
}
}
} catch (NoSuchFieldException e) {
Log.e(TAG, e.toString());
} catch (IllegalArgumentException e) {
Log.e(TAG, e.toString());
} catch (IllegalAccessException e) {
Log.e(TAG, e.toString());
}
return null;
}
이게 여러분 모두에게 어떻게 작용합니까?
public Object instantiateItem(final ViewGroup container, final int position) {
CustomHomeView RL = new CustomHomeView(MainActivity.ctxt);
if (position==0){
container.setId(R.id.home_container);} ...rest of code
다음은 페이지에 액세스하는 코드입니다.
((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);
원한다면 약간의 미트 호드를 설정할 수 있습니다.
RelativeLayout getPageAt(int index){
RelativeLayout rl = ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
return rl;
}
이 시도
final int position = mViewPager.getCurrentItem();
Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"
+ position);
좀 더 일반적으로해야했기 때문에 ViewPager의 비공개 '위치'를 사용하기로 결정했습니다.
final int childCount = viewPager.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = viewPager.getChildAt(i);
final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
int position = 0;
try {
Field f = lp.getClass().getDeclaredField("position");
f.setAccessible(true);
position = f.getInt(lp); //IllegalAccessException
} catch (NoSuchFieldException | IllegalAccessException ex) {ex.printStackTrace();}
if (position == viewPager.getCurrentItem()) {
viewToDraw = child;
}
}
FabulousFilter의 ViewPagerUtils 를 사용하고 있습니다 .
ViewPagerUtils.getCurrentView(ViewPager viewPager)
그게 화면에서의 첫 번째 활동입니까, 아니면 이미 서로 위에 일부를 겹쳤습니까?
이 시도:
findViewById(android.R.id.content).getRootView()
또는 그냥 :
findViewById(android.R.id.content)
또한 시도하려는 것에 따라 :
((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)
시스템 태그로 조각을 찾을 수 있습니다. 그것은 나를위한 일입니다. OnMeasure
기능적으로 사용했습니다 .
id
-viewPager ID
position
-당신이 얻고 싶은 조각
Important! You get this fragment if your fragment was created in adapter. So you must to check supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position)
nullify
You can get view like this:
supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position).view
You shouldn't give custom tag in adapter
If you examine carefully, there are at most 3 views saved by ViewPager. You can easily get the current view by
view = MyActivity.mViewPager.getChildAt(1);
Please check this
((ViewGroup))mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()));
else verify this link.
참고URL : https://stackoverflow.com/questions/12854783/android-viewpager-get-the-current-view
'program story' 카테고리의 다른 글
\ u003C는 무엇을 의미합니까? (0) | 2020.11.17 |
---|---|
Hive는 HDFS에서 파일을 어디에 저장합니까? (0) | 2020.11.17 |
C에서 sizeof 연산자는 2.5m를 통과하면 8 바이트를 반환하지만 1.25m * 2를 통과하면 4 바이트를 반환합니다. (0) | 2020.11.17 |
교리-관계를 통해 새로운 실체가 발견되었습니다. (0) | 2020.11.17 |
요소를 따라 목록을 하위 목록으로 분할 (0) | 2020.11.17 |