1

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

这是我包含我的 3 个滑块图像的地方 slidelist.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>

以下是适配器类

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;

    }
}

4

2 回答 2

0

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

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

    }
}
于 2019-03-24T16:55:54.330 回答
0

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

kotlin 中的这段代码。

 override fun onDestroyView() {

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

    }
    super.onDestroyView()
}

希望这对你有帮助

于 2019-02-04T05:31:46.783 回答