如何使用计时器修复错误到ImageView?

时间:2015-01-19 18:36:27

标签: android android-layout android-activity android-fragments android-viewpager

我有一个包含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”但它没有帮助。看下面的图片。

enter image description here 感谢任何帮助。谢谢!

修改

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));

2 个答案:

答案 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 ..这是项目..对不起拖延..

我在测试期间遵循的一些链接 12345&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();