J'ai un ViewPager et j'aimerais obtenir la vue actuellement sélectionnée et visible, pas une position.
getChildAt(getCurrentItem)
renvoie faux View
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;
}
}
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);
Je l'ai compris. Ce que j'ai fait est d'appeler setTag()
avec un nom pour tous les View
s/ListView
s 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.
Je viens de rencontrer le même problème et le résoudre en utilisant:
View view = MyActivity.mViewPager.getFocusedChild();
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;)
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;
}
// .......
}
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;
}
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:
null
si cette vue n'est pas chargée, ou la vue correspondante.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;
}
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)
Essaye ça
final int position = mViewPager.getCurrentItem();
Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
+ position);
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;
}
}
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)