Ich habe einen ViewPager und möchte die aktuell ausgewählte und sichtbare Ansicht erhalten, keine Position.
getChildAt(getCurrentItem)
liefert falsche View
Das funktioniert nicht immer. Gibt manchmal Null zurück, manchmal nur falsche Ansicht.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser == true) {
mFocusedListView = ListView;
}
}
PageListener auf ViewPager
mit getChildAt()
funktioniert auch nicht und gibt mir nicht jedes Mal die richtige Ansicht.
Wie kann ich eine aktuelle sichtbare Ansicht erhalten?
View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
Ich habe es herausgefunden. Was ich tat, war, setTag()
mit einem Namen für alle View
s/ListView
s aufzurufen, und einfach findViewWithTag(mytag)
aufzurufen, mytag
als Tag.
Leider gibt es keine andere Möglichkeit, dieses Problem zu lösen.
Ich bin gerade auf das gleiche Problem gestoßen und habe es mit folgendem behoben:
View view = MyActivity.mViewPager.getFocusedChild();
Sie können das aktuelle Element abrufen, indem Sie über Ihren Adapter auf Ihre Liste der itens zugreifen. myAdapter.yourListItens.get(myViewPager.getCurrentItem());
Wie Sie sehen, kann ViewPager den aktuellen Index des Elements Ihres Adapters abrufen (aktuelle Seite).
Wenn Sie FragmentPagerAdapter verwenden, können Sie diese Umwandlung durchführen:
FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();
und Ruf an
adapter.getItem(myViewPager.getCurrentItem());
Das funktioniert sehr gut für mich;)
Verwenden Sie einen Adapter, der PagerAdapter erweitert, und setzen Sie die setPrimaryItem-Methode in Ihrem PagerAdapter außer Kraft.
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;
}
// .......
}
wie sieht das für euch alle aus?
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
dann ist hier der 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 ein kleines Meathod einrichten
RelativeLayout getPageAt(int index){
RelativeLayout rl = ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
return rl;
}
Während meiner Bemühungen, einen Weg zu finden, Android-Ansichten zu gestalten, denke ich, habe ich eine alternative Lösung für das Problem des OP definiert, das ich in meinem Blog dokumentiert habe. Ich verlinke darauf, da der Code ein bisschen zu viel ist, um alles hier aufzunehmen.
Die Lösung, die ich vorschlage:
null
zurückgeben, wenn diese Ansicht derzeit nicht geladen ist, oder die entsprechende Ansicht.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;
}
ist das deine erste tätigkeit auf dem bildschirm oder hast du schon einige übereinander geschichtet?
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)
Versuche dies
final int position = mViewPager.getCurrentItem();
Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
+ position);
Ich musste es allgemeiner machen, also entschied ich mich für die private Position von 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;
}
}
Sie können Fragment anhand der Systemkennung finden. Es ist Arbeit für mich. Ich habe es in OnMeasure
verwendet.
id
- viewPager ID
position
- Fragment, das Sie erhalten möchten
Wichtig! Sie erhalten dieses Fragment, wenn Ihr Fragment im Adapter erstellt wurde. Sie müssen also supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position)
nullify überprüfen
Sie können wie folgt sehen:
supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position).view
Sie sollten kein benutzerdefiniertes Tag im Adapter angeben
Ich benutze ViewPagerUtils von FabulousFilter :
ViewPagerUtils.getCurrentView(ViewPager viewPager)