Ich habe einen ViewPager und möchte die aktuell ausgewählte und sichtbare Ansicht erhalten, keine Position.
getChildAt(getCurrentItem)
gibt falsch zurückView
Dies funktioniert nicht immer. Manchmal wird null zurückgegeben, manchmal wird nur die falsche Ansicht zurückgegeben.
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser == true) { mFocusedListView = ListView; } }
PageListener auf
ViewPager
mitgetChildAt()
auch nicht funktioniert, nicht mir die richtige Ansicht zu geben , jedes Mal.
Wie kann ich die aktuell sichtbare Ansicht erhalten?
View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
Ich bin gerade auf dasselbe Problem gestoßen und habe es gelöst, indem ich Folgendes verwendet habe:
View view = MyActivity.mViewPager.getFocusedChild();
quelle
mViewPager.getChildAt(i).isFocused()
für alle Kinder tue , berichtet esfalse
für alle Kinder. Das liegt wahrscheinlich daran, dass ich diesen Code in das Optionsmenü einfüge, das Teil der MainActivity ist, wodurch der Fokus vom ViewPager verschoben wird. Daher funktioniert dieser Weg in bestimmten Situationen nicht.Sie können das aktuelle Element abrufen, indem
myAdapter.yourListItens.get(myViewPager.getCurrentItem());
Sie von Ihrem Adapter aus auf Ihre Liste der Elemente zugreifen. Wie Sie sehen, kann ViewPager den aktuellen Index des Elements Ihres Adapters abrufen (aktuelle Seite).Wenn Sie FragmentPagerAdapter verwenden, können Sie folgende Umwandlung durchführen:
und Ruf an
adapter.getItem(myViewPager.getCurrentItem());
Das funktioniert sehr gut für mich;)
quelle
getItem()
beim Unterklassen immer eine neue Instanz eines Fragments zurückgegeben werden sollFragment(State)PagerAdapter
. Daher ist dies nicht richtig, da nur eine neue Instanz erstellt wird, anstatt die "alte" zurückzugeben.Ich benutze diese Methode mit
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; }
quelle
Während meiner Bemühungen, einen Weg zu finden, um Android-Ansichten zu dekorieren, habe ich eine alternative Lösung für das OP-Problem definiert, das ich in meinem Blog dokumentiert habe . Ich verlinke darauf, da der Code ein bisschen zu viel zu sein scheint, um hier alles aufzunehmen.
Die Lösung, die ich vorschlage:
null
wenn diese Ansicht derzeit nicht geladen ist, oder der entsprechenden Ansicht.quelle
Ich verwende ViewPagerUtils von FabulousFilter :
ViewPagerUtils.getCurrentView(ViewPager viewPager)
quelle
Verwenden Sie einen Adapter, der PagerAdapter erweitert, und überschreiben Sie die setPrimaryItem-Methode in Ihrem 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; View onScreenView = getChildAt(position); } // ....... }
quelle
Versuche dies
final int position = mViewPager.getCurrentItem(); Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":" + position);
quelle
Ich musste es allgemeiner machen, also entschied ich mich, die private 'Position' von ViewPager.LayoutParams zu verwenden
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; } }
quelle
Wenn Sie nicht viele Seiten haben und sicher anwenden können,
setOffscreenPageLimit(N-1)
wobei N die Gesamtzahl der Seiten ist, ohne zu viel Speicher zu verschwenden, können Sie Folgendes tun:public Object instantiateItem(final ViewGroup container, final int position) { CustomHomeView RL = new CustomHomeView(context); if (position==0){ container.setId(R.id.home_container);} ...rest of code
Dann ist hier Code, um auf Ihre Seite zuzugreifen
((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);
Wenn Sie möchten, können Sie eine Methode für den Zugriff auf eine Seite einrichten
RelativeLayout getPageAt(int index){ RelativeLayout rl = ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index)); return rl; }
quelle
getChildAt(pager.getCurrentItem())
macht nicht was du willst Zum Beispiel kann ViewPager 1000 Seiten haben, aber nur 5 Kinder, sodass Sie keine Grenzen mehr haben, wenn das aktuelle Element die letzte Seite ist.Ist das Ihre erste Aktivität auf dem Bildschirm oder haben Sie bereits einige übereinander gelegt?
Versuche dies:
findViewById(android.R.id.content).getRootView()
oder nur:
findViewById(android.R.id.content)
auch je nachdem was du willst versuchen:
((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)
quelle
Sie können das Fragment nach System-Tag finden. Es ist Arbeit für mich. Ich habe es in
OnMeasure
Funktion verwendet.id
- viewPager IDposition
- Fragment, das Sie erhalten möchtenWichtig! Sie erhalten dieses Fragment, wenn Ihr Fragment im Adapter erstellt wurde. Sie müssen also nullify
supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position)
aktivierenSie können Ansicht wie folgt erhalten:
supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position).view
Sie sollten im Adapter kein benutzerdefiniertes Tag angeben
quelle
viewpager.getChildAt(0)
Dies gibt immer meine aktuell ausgewählte Ansicht zurück. Das hat bei mir funktioniert, aber ich weiß nicht wie.
quelle
Bei sorgfältiger Prüfung werden von ViewPager höchstens 3 Ansichten gespeichert. Sie können die aktuelle Ansicht ganz einfach über abrufen
view = MyActivity.mViewPager.getChildAt(1);
quelle
setOffscreenPageLimit(int)
Bitte prüfen Sie das
((ViewGroup))mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()));
Andernfalls überprüfen Sie diesen Link .
quelle
getChildAt()
unterscheidet sich vom Bereich vongetCurrentItem()
. Wenn Ihr ViewPager beispielsweise 20 Elemente und 1 Offscreen-Seite anzeigtgetChildAt()
, beträgt der Bereich 0-2, währendgetCurrentItem()
der Bereich 0-19 beträgt. Sie würden meistens Null-Rückgabewerte erhalten.