我有一个包含3个碎片的Viewpager。当应用程序首先打开用户时,看到第一页有一些ImageView。我使用onPageSelected(int position)
方法让计时器可以看到ImageView
。但它没有按预期工作。我有 2个问题。
1)计时器仅在您打开页面时启动(假设您从第二页或第三页到达第一页。可以通过滚动或通过Tabs)。 如何在应用首次打开时启动计时器?以下是我的计时器版本:
public void onPageSelected(int position) {
final ImageView mImageView = (ImageView) findViewById(R.id.mobile_location);
if(mImageView!=null) mImageView.setVisibility(View.INVISIBLE);
if (position == 0) {
mImageView.postDelayed(new Runnable() {
public void run() {
if(mImageView!=null) mImageView.setVisibility(View.GONE);
mImageView.startAnimation(fadeInAnimation());
}
}, 2000);
}
2)我注意到当我从第二页滚动到第一页时,我看到第一页的ImageViews在边缘但实际上它们必须是不可见的,只有在页面时才可见完全显示出来。我怎么解决这个问题。我使用android:visibility =“invisible”但它没有帮助。看下面的图片。
感谢任何帮助。谢谢!
修改
Fragment1.java
public class TabFragment1 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab_1, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final ImageView mImageView = (ImageView) getView().findViewById(R.id.mobile_location);
if(mImageView.getVisibility() == View.VISIBLE){
mImageView.setVisibility(View.INVISIBLE);
}
}
@Override
public void onPause() {
super.onPause();
final ImageView mImageView = (ImageView) getView().findViewById(R.id.mobile_location);
mImageView.setVisibility(View.INVISIBLE);//I used GONE also thesame effect
}
@Override
public void onResume(){
super.onResume();
final ImageView mImageView = (ImageView) getView().findViewById(R.id.mobile_location);
new Handler().postDelayed(new Runnable() {
public void run() {
mImageView.setVisibility(View.VISIBLE);
mImageView.startAnimation(fadeInAnimation());
}
}, 2000);
}
private Animation fadeInAnimation() {
Animation animation = new AlphaAnimation(0f, 1.0f);
animation.setDuration(2000); // in milliseconds, change to whatever you want
animation.setFillEnabled(true);
animation.setFillAfter(true);
return animation;
}
}
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final int PAGES = 3;
private String[] titles={"Map", "Organizations", "News"};
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
default:
throw new IllegalArgumentException("The item position should be less or equal to:" + PAGES);
}
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public int getCount() {
return PAGES;
}
MainActivity.java (在onCreate方法中使用以下代码)
// Initialize the ViewPager and set an adapter
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
// Bind the tabs to the ViewPager
PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabs.setViewPager(pager);
tabs.setTextColor(getResources().getColor(android.R.color.white));
答案 0 :(得分:1)
事实的真相是,我认为它不可能,当你从第2页移到第3页时,你有这种效果的原因是因为ViewPager.setOffscreenPageLimit(int);
(旁注:你不能把它设置为零......安装你的)默认情况下设置为1,所以当页面1启动时,页面2加载,但页面3不加载,当页面2显示页面1加载,第3页已加载,第3页已启动,第2页已加载,没有第4页因此暂停,当您进入第1页时,则会尝试从scracth重新创建第1页,因此生命周期不会在滚动浏览页面时调用页面,除非它们正在重新创建,当你关闭寻呼机时,为加载的页面调用所有onPause()
周期,可能我们需要但是在3小时后尝试/错误我来到这里太好的解决方法把它们放在你的碎片中..
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
try { // AT THE END THIS WORKED..PLAY AROUND HERE
//getView().findViewById(R.id.imageView1).setVisibility(View.INVISIBLE); // might be called in the process of measurement
//getView().findViewById(R.id.imageView1).setVisibility(View.VISIBLE);
getView().findViewById(R.id.imageView1).startAnimation(fadeInAnimation());
} catch (Exception e) {
// TODO: handle exception
Log.v("logger", "was measuring");
}
/*try {
getView().invalidate(); //didnt work
} catch (Exception e) {
// TODO: handle exception
}*/
}else{
// fragment is no longer visible
try {
getView().findViewById(R.id.imageView1).setVisibility(View.INVISIBLE);
} catch (Exception e) {
// TODO: handle exception
Log.v("logger", "was measuring");
}
}
}
但在我的测试中这是我的thought process ..这是项目..对不起拖延..
我在测试期间遵循的一些链接 1,2,3,4,5&lt; =第5个是其中之一为什么我在想?< / em> 什么?? 现在关注!! 表达式..
但最后,我认为是可能的,你知道但是,我只是不知道......如果我保持你的希望,我很抱歉
答案 1 :(得分:0)
直接在UI线程上执行此代码。哪个你不应该。 我建议你把你的代码片段放在Thread中。
试试这个。
new Thread(new Runnable() {
public void run() {
final ImageView mImageView = (ImageView) getView().findViewById(R.id.mobile_location);
if(mImageView!=null) mImageView.setVisibility(View.INVISIBLE);
mImageView.postDelayed(new Runnable() {
public void run() {
if(mImageView!=null) mImageView.setVisibility(View.VISIBLE);
mImageView.startAnimation(fadeInAnimation());
}
}, 2000);
}
}).start();