ViewPagerがあり、位置ではなく、現在選択されている表示可能なビューを取得したいです。
getChildAt(getCurrentItem)
は間違ったView
を返しますこれは常に機能するわけではありません。時々nullを返し、時々間違ったViewを返します。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser == true) {
mFocusedListView = ListView;
}
}
ViewPager
のgetChildAt()
のPageListenerも機能せず、毎回正しいビューが表示されません。
現在の表示ビューを取得するにはどうすればよいですか?
View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
私はそれを理解しました。私がしたことは、setTag()
をすべてのView
s/ListView
sに名前を付けて呼び出し、タグとしてfindViewWithTag(mytag)
、mytag
を呼び出すだけでした。
残念ながら、これを解決する方法は他にありません。
私はちょうど同じ問題に遭遇し、以下を使用して解決しました:
View view = MyActivity.mViewPager.getFocusedChild();
myAdapter.yourListItens.get(myViewPager.getCurrentItem());
を呼び出すアダプターからitensのリストにアクセスすると、現在の要素を取得できます。ご覧のとおり、ViewPagerはアダプターの要素(現在のページ)の現在のインデックスを取得できます。
FragmentPagerAdapterを使用している場合、次のキャストを実行できます。
FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();
そして電話する
adapter.getItem(myViewPager.getCurrentItem());
これは私にとって非常にうまくいきます;)
PagerAdapterを拡張するアダプターを使用し、PagerAdapter内でsetPrimaryItemメソッドをオーバーライドします。
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;
}
// .......
}
Androidビューを装飾する方法を見つけるための努力中に、 私のブログ で文書化したOPの問題の代替ソリューションを定義したと思います。ここにすべてを含めるにはコードが少し多すぎるように見えるので、私はそれにリンクしています。
私が提案する解決策:
null
または対応するビューが返されます。このメソッドは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;
}
これはすべての人にとってどのように機能しますか?
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);
必要に応じて、小さなミートホッドをセットアップできます
RelativeLayout getPageAt(int index){
RelativeLayout rl = ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
return rl;
}
画面上での最初のアクティビティですか、それともすでにいくつかのレイヤーを重ねていますか?
これを試して:
findViewById(Android.R.id.content).getRootView()
あるいは単に:
findViewById(Android.R.id.content)
また、あなたが試したいものに応じて:
((ViewGroup)findViewById(Android.R.id.content)).getChildAt(0)
これを試して
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;
}
}
フラグメントはシステムタグで検索できます。それは私の仕事です。 OnMeasure
関数で使用しました。
id
-viewPager ID
position
-取得するフラグメント
重要!フラグメントがアダプタで作成された場合、このフラグメントを取得します。したがって、supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position)
nullifyをチェックする必要があります
次のようなビューを取得できます。
supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position).view
アダプタにカスタムタグを付けないでください
ViewPagerUtils from FabulousFilter を使用しています。
ViewPagerUtils.getCurrentView(ViewPager viewPager)