program story

Android ViewPager는 현재보기를 가져옵니다.

inputbox 2020. 11. 17. 08:05
반응형

Android ViewPager는 현재보기를 가져옵니다.


ViewPager가 있고 위치가 아닌 현재 선택되고 표시되는 뷰를 얻고 싶습니다.

  1. getChildAt(getCurrentItem) 잘못 반환 View
  2. 이것은 항상 작동하지 않습니다. 때로는 null을 반환하고 때로는 잘못된 View를 반환합니다.

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
  3. 에 PageListener ViewPagergetChildAt()도마다 나에게 올바른보기를 포기하지 않을, 작동하지 않습니다.

현재 보이는보기를 얻으려면 어떻게해야합니까?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);

나는 그것을 알아 냈다. 내가 한 일은 전화를했다 setTag()모든 이름으로 ViewS / ListViewS, 그냥 전화 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

반응형