Ответ 1
Я понял это. То, что я сделал, это вызвал setTag()
с именем для всех View
/ListView
, и просто вызвал findViewWithTag(mytag)
, mytag
был тегом.
К сожалению, нет другого способа решить эту проблему.
У меня есть ViewPager, и я хотел бы получить текущий выбранный и видимый вид, а не позицию.
getChildAt(getCurrentItem)
возвращает неправильный View
Это работает не все время. Иногда возвращает ноль, иногда просто возвращает неправильный вид.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser == true) {
mFocusedListView = ListView;
}
}
PageListener на ViewPager
с getChildAt()
также не работает, не давая мне каждый раз правильный просмотр.
Как я могу получить текущий видимый вид?
View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
Я понял это. То, что я сделал, это вызвал setTag()
с именем для всех View
/ListView
, и просто вызвал 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());
Это очень хорошо для меня;)
Используйте адаптер, расширяющий PagerAdapter, и переопределите метод setPrimaryItem внутри вашего 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;
}
// .......
}
Во время моих попыток найти способ украсить андроид-представления, я думаю, что я определил альтернативное решение для той проблемы OP, которую я зарегистрировал в мой блог, Я связываюсь с ним, поскольку код, кажется, немного слишком много для включения всего здесь.
Решение, которое я предлагаю:
null
, если это представление в настоящее время не загружено, либо соответствующее представление.- это ваше первое действие на экране или вы уже многоуровневали друг над другом?
попробуйте следующее:
findViewById(android.R.id.content).getRootView()
или просто:
findViewById(android.R.id.content)
также зависит от того, что вы хотите попробовать:
((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)
как это происходит для всех y'all?
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);
Если вы хотите, вы можете настроить маленький meathod
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.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;
}
}
Я использую ViewPagerUtils от FabulousFilter:
ViewPagerUtils.getCurrentView(ViewPager viewPager)
Вы можете найти фрагмент по системному тегу. Это работает для меня. Я использовал это в функции OnMeasure
.
id
- id
viewPager
position
- фрагмент, который вы хотите получить
Важный! Вы получите этот фрагмент, если ваш фрагмент был создан в адаптере. Поэтому вы должны проверить supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position)
обнулить
Вы можете получить вид, как это:
supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position).view
Вы не должны давать пользовательский тег в адаптере
Я использую этот метод с 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;
}
Пожалуйста, проверьте это
((ViewGroup))mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()));
else проверьте эту ссылку.
Если вы внимательно изучите, на ViewPager будет сохранено не более 3 просмотров. Вы можете легко получить текущий вид
view = MyActivity.mViewPager.getChildAt(1);