web-dev-qa-db-fra.com

Android ViewPager obtenir la vue actuelle

J'ai un ViewPager et j'aimerais obtenir la vue actuellement sélectionnée et visible, pas une position. 

  1. getChildAt(getCurrentItem) renvoie faux View
  2. Cela ne marche pas tout le temps. Parfois, retourne null, parfois, retourne simplement une mauvaise vue.

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
  3. PageListener sur ViewPager avec getChildAt() également ne fonctionne pas, ne me donnant pas la vue correcte à chaque fois 

Comment puis-je obtenir la vue visible actuelle?

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

Je l'ai compris. Ce que j'ai fait est d'appeler setTag() avec un nom pour tous les Views/ListViews et d'appeler simplement findViewWithTag(mytag), mytag étant la balise.

Malheureusement, il n'y a pas d'autre moyen de résoudre ce problème.

111
lacas

Je viens de rencontrer le même problème et le résoudre en utilisant:

View view = MyActivity.mViewPager.getFocusedChild();
8
ZeCodea

Vous pouvez obtenir l'élément actuel en accédant à votre liste d'objets à partir de votre adaptateur appelant myAdapter.yourListItens.get(myViewPager.getCurrentItem()); Comme vous pouvez le constater, ViewPager peut récupérer l'index actuel de l'élément de votre adaptateur (page actuelle).

Si vous utilisez FragmentPagerAdapter, vous pouvez effectuer cette conversion: 

FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();

et appeler

adapter.getItem(myViewPager.getCurrentItem());

Cela fonctionne très bien pour moi;)

7
Gilian

Utilisez un adaptateur qui étend PagerAdapter et substituez la méthode setPrimaryItem dans votre PagerAdapter.

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;
    }

    // .......

}
3
Andrés

comment cela se passe-t-il pour tous?

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

alors voici le code pour accéder à votre page

((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);

Si vous voulez, vous pouvez installer un peu de meathod

RelativeLayout getPageAt(int index){
    RelativeLayout rl =  ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
    return rl;
}
2
Michael Kern

Au cours de mes efforts pour trouver un moyen de décorer les vues Android, je pense avoir défini une solution alternative au problème du PO que j'ai documentée dans mon blog . Je suis lié à cela car le code semble être un peu trop pour tout inclure ici.

La solution que je propose:

  • maintient l'adaptateur et la vue entièrement séparés
  • on peut facilement rechercher une vue avec n'importe quel index du pageur de vue et il sera retourné soit null si cette vue n'est pas chargée, ou la vue correspondante.
2
Boris Strandjev

J'utilise cette méthode avec 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;
    }
2
Dmitry Yablokov

est-ce votre première activité à l'écran ou en avez-vous déjà superposé plusieurs?

essaye ça:

findViewById(Android.R.id.content).getRootView()

ou juste:

findViewById(Android.R.id.content) 

également en fonction de ce que vous voulez essayer:

((ViewGroup)findViewById(Android.R.id.content)).getChildAt(0)
1
SunnySonic

Essaye ça 

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
            + position);
1
Son Nguyen Thanh

Je devais le faire de manière plus générale, alors j'ai décidé d'utiliser la position privée de ViewPager.LayoutParams

        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;
            }
        }
1
Kamen Dobrev

Vous pouvez trouver fragment par tag système. C'est un travail pour moi. Je l'ai utilisé dans la fonction OnMeasure.

id - ID de viewPager 

position - fragment que vous voulez obtenir

Important! Vous obtenez ce fragment si votre fragment a été créé dans l'adaptateur. Donc, vous devez vérifier supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position) nullify

Vous pouvez obtenir une vue comme celle-ci:

supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position).view

Vous ne devriez pas donner de balise personnalisée dans l'adaptateur

J'utilise ViewPagerUtils de FabulousFilter

ViewPagerUtils.getCurrentView(ViewPager viewPager)
0
Aleksandar Acić