【问题标题】:Image slider moving fast in android when comeback from another activity从另一个活动恢复时,图像滑块在 android 中快速移动
【发布时间】:2018-02-20 06:32:35
【问题描述】:

在我的 android 应用程序中,我有一个使用 viewpager 的图像滑块,它在主 Activity 中每 2.5 秒更改一次图像,当我打开应用程序时它工作正常,但问题是当我从 MainActivity 跳转到另一个 Activity 并来时回到它,开始快速移动幻灯片中的图像,就像我跳到另一个活动一样,滑动变得更快。请帮助。

这是我包含我的 3 个滑块图像的地方 幻灯片列表.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:id="@+id/image1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:layout_gravity="center"
        android:src="@drawable/slidetwo"
        android:scaleType="centerCrop"/>

    <ImageView
        android:id="@+id/image2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
      android:adjustViewBounds="true"
        android:layout_gravity="center"
        android:src="@drawable/slideone"
        android:scaleType="centerCrop"/>


    <ImageView
        android:id="@+id/image3"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:layout_gravity="center"
        android:src="@drawable/slidethree"
        android:scaleType="centerCrop"/>
    
</FrameLayout>

这是内容 main.xml 中的滑块布局(包含在活动中)

 <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="250dp"
        android:layout_below="@+id/linearone">
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentTop="true" />
        <me.relex.circleindicator.CircleIndicator
            android:id="@+id/indicator"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_alignParentBottom="true"/>
    </RelativeLayout>

下面是adpater类

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.rimapps.icar_iisr_turmeric.R;

import java.util.ArrayList;


public class SlideAdapter extends PagerAdapter {
    private ArrayList<Integer> images;
    private LayoutInflater inflater;
    private Context context;

    public SlideAdapter(Context context, ArrayList<Integer> images) {
        this.context = context;
        this.images=images;
        inflater = LayoutInflater.from(context);
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
    @Override
    public int getCount() {
        return images.size();
    }
    @Override
    public Object instantiateItem(ViewGroup view, int position) {
        View myImageLayout = inflater.inflate(R.layout.slidelist, view, false);
        ImageView myImage1 = (ImageView) myImageLayout.findViewById(R.id.image1);
        ImageView myImage2 = (ImageView) myImageLayout.findViewById(R.id.image2);
        ImageView myImage3 = (ImageView) myImageLayout.findViewById(R.id.image3);

        myImage1.setImageResource(images.get(position));
        myImage2.setImageResource(images.get(position));
        myImage3.setImageResource(images.get(position));

        view.addView(myImageLayout, 0);
        return myImageLayout;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }
}

这是我的 MainActivity 类,在这里我定义了滑块的计时器

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.internal.NavigationMenuItemView;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import com.example.rimapps.icar_iisr_turmeric.R;
import com.example.rimapps.icar_iisr_turmeric.control.ButtonAdapter;
import com.example.rimapps.icar_iisr_turmeric.control.SlideAdapter;
import com.example.rimapps.icar_iisr_turmeric.model.ContentsDep;
import com.example.rimapps.icar_iisr_turmeric.utils.LocaleHelper;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import me.relex.circleindicator.CircleIndicator;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {


    CircleIndicator indicator;
    int period=2500, delay = 2500;
    
    private static ViewPager mPager;
    private static int currentPage = 0;
    private static final Integer[] slide = {R.drawable.slideone, R.drawable.slidetwo, R.drawable.slidethree};
    private ArrayList<Integer> slidearray = new ArrayList<Integer>();
    Timer swipeTimer;
    
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

init();

}

//Image slider function//

    private void init() {
        for (int i = 0; i < slide.length; i++)
            slidearray.add(slide[i]);
        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(new SlideAdapter(MainActivity.this, slidearray));
        CircleIndicator indicator = (CircleIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(mPager);


        // Auto start of viewpager
        final Handler handler = new Handler();
        final Runnable Update = new Runnable() {
            public void run() {
                if (currentPage == slide.length) {
                    currentPage = 0;
                }
                mPager.setCurrentItem(currentPage++, true);
            }
    };

    swipeTimer =new Timer();
    swipeTimer.schedule(new

    TimerTask() {
        @Override
        public void run () {


           Log.d("hjgv","yughi");

            handler.post(Update);
        }
    },delay,period);

}

@Override
    protected void onStop() {
        super.onStop();
     // swipeTimer.cancel();
       delay=0;
       period=0;

    }

    @Override
    protected void onRestart() {
        super.onRestart();
        delay=2500;
        period=2500;

    }
}

【问题讨论】:

  • 我也有同样的问题,请问有解决办法吗?

标签: android timer android-viewpager androidimageslider


【解决方案1】:

问题出在你的计时器上。 当您转到另一个片段或活动然后返回该片段时,您必须取消计时器 ondestroyview,因为当您返回片段时,您的 oncreateview 将再次调用,因此计时器被初始化,然后速度是 2 倍的倍数。每次都会发生这种情况。

kotlin 中的这段代码。

 override fun onDestroyView() {

    if(swipeTimer != null) {
        swipeTimer.cancel()

    }
    super.onDestroyView()
}

希望对你有帮助

【讨论】:

    【解决方案2】:

    只需在 ondestryView() 方法中调用取消 Timer 的实例

     @Override
    public void onDestroyView() {
        super.onDestroyView();
        if(swipeTimer != null) {
            swipeTimer.cancel();
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2012-07-25
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多