Vik*_*uli 16 java android android-fragments android-view android-viewpager
我知道StackOverflow中有很多类似的问题,但我的问题却略有不同.
我有嵌套的Fragments层次结构,如下面的结构:
Activity
|
|
AFragment
|
(ViewPager)
| |
| |
BFragment BFragment .....
|
(ViewPager)
| |
| |
CFragment CFragment ...
|
(ViewPager)
| |
| |
DFragment DFragment ...
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否DFragment向用户显示?
我尝试了很多来自StackOverflow的解决方案,但无法取得成功.
我尝试的是:
我尝试setUserVisibleHint()但它返回上面的层次结构中的true多个DFragment,这是一个原因ViewPager
我也试过这些链接:link1,link2,link3等......但没有得到实际的解决方案.
等待帮助.谢谢.
UPDATE
适配器类
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
Run Code Online (Sandbox Code Playgroud)
azi*_*ian 23
您可以检查View设备屏幕上是否显示该片段已膨胀:
Fragment fragment = ... // retrieve from `ViewPager`'s adapter.
View fragmentRootView = fragment.getView();
if (fragmentRootView != null && fragmentRootView.getGlobalVisibleRect(new Rect())) {
// fragment is visible
} else {
// fragment is not visible
}
getGlobalVisibleRect()true如果视图的一部分在根级别可见,则返回.
尝试这个
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
}
else
{
}
}
Run Code Online (Sandbox Code Playgroud)
您可以override setUserVisibleHint()在每个片段中使用附加标志检查它是否可见。举个例子
爪哇:
boolean isVisited = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !isVisited )
{
isVisited = true;
}
else if(isVisited)
{
// this fragment is already in front of user
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到了类似的问题。曾经我需要将数据从服务器加载到fragment仅当它在用户面前时。我按照上面的方法解决了。
科特林:
private var isVisited: Boolean = false
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser && !isVisited!! )
{
isVisited = true;
}
else if(isVisited!!)
{
Toast.makeText(activity!!, "Location required", Toast.LENGTH_SHORT).show()
}
}
Run Code Online (Sandbox Code Playgroud)
希望它也能帮助你。
试试这个..
在isVisible()增加了清晰视野检查的一个额外层。
ViewPager viewPager=(ViewPager)findViewById(R.id.view_pager);
final Fragment[] fragments={new DFragment(),new MyFragment()}; //add all the other fragment objects present in the view pager......
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(fragments[position].isVisible()){
//Cool stuff to do.
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16622 次 |
| 最近记录: |