2 つのページを持つ ViewPager を使用する Android アプリケーションがあります。アクティビティが最初に表示されるときに、各ページをユーザーに順番に表示して、2 つのビュー間でスワイプできることをユーザーに知らせたいと思います。これを行う方法を説明しているドキュメントは見つかりませんでした。私は有望に聞こえる PageTransformations を発見しましたが、ユーザーは最初にスワイプする必要があります。ViewPager の最初のページが表示されるとすぐに、2 つのページを自動的にスクロールする必要があります。どうすれば望ましい結果を達成できますか?
9 に答える
Timer
この目的で使用できます。次のコードは自明です。
// ---------------------------------------------------------------------------
Timer timer;
int page = 1;
public void pageSwitcher(int seconds) {
timer = new Timer(); // At this line a new Thread will be created
timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay
// in
// milliseconds
}
// this is an inner class...
class RemindTask extends TimerTask {
@Override
public void run() {
// As the TimerTask run on a seprate thread from UI thread we have
// to call runOnUiThread to do work on UI thread.
runOnUiThread(new Runnable() {
public void run() {
if (page > 4) { // In my case the number of pages are 5
timer.cancel();
// Showing a toast for just testing purpose
Toast.makeText(getApplicationContext(), "Timer stoped",
Toast.LENGTH_LONG).show();
} else {
mViewPager.setCurrentItem(page++);
}
}
});
}
}
// ---------------------------------------------------------------------------
注 1:アクティビティの内部メソッドを適切pageSwitcher
に設定した後、必ずメソッドadapter
を呼び出してください。viewPager
onCreate
注 2:は、viewPager
起動するたびにスワイプします。すべてのページを 1 回だけスワイプするように処理する必要があります (ユーザーがviewPager
初めて表示するとき) 。
注 3:のスクロール速度をさらに遅くしたい場合は、 StackOverflow でこの回答に従うviewPager
ことができます。
それがあなたを助けることができなかった場合は、コメントで教えてください...
質問は古いですが、Runnableを使用した私のソリューションが誰かに役立つことを願っています
簡潔な答え
Runnable runnable = new Runnable() {
public void run() {
if (myAdapter.getCount() == page) {
page = 0;
} else {
page++;
}
viewPager.setCurrentItem(page, true);
handler.postDelayed(this, delay);
}
};
長文回答 アクティビティでの使用
public class activity extends AppCompatActivity {
private Handler handler;
private int delay = 5000; //milliseconds
private ViewPager viewPager;
private int page = 0;
private MyAdapter myAdapter;
Runnable runnable = new Runnable() {
public void run() {
if (myAdapter.getCount() == page) {
page = 0;
} else {
page++;
}
viewPager.setCurrentItem(page, true);
handler.postDelayed(this, delay);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
viewPager = (ViewPager) findViewById(R.id.viewPager);
myAdapter = new MyAdapter(getSupportFragmentManager());
viewPager.setAdapter(myAdapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
page = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@Override
protected void onResume() {
super.onResume();
handler.postDelayed(runnable, delay);
}
@Override
protected void onPause() {
super.onPause();
handler.removeCallbacks(runnable);
}
}
以下の方法は、しばらくすると自動的にページを切り替えるために使用されます(要件に応じて時間を変更できます)
private void timer() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (currentPage == NUM_PAGES - 1) {
currentPage = 0;
}
view.setCurrentItem(currentPage++, true);
}
});
}
}, 500, 5000);
}
ビューページャーで無限にスクロールしたい場合は、以下の提供されたリンクから無限スクロール ビューページャー クラスを使用し、Runnable インターフェイスでマイナーな変更 (条件の削除) を行います。
runOnUiThread(new Runnable() {
@Override
public void run() {
view.setCurrentItem(currentPage++, true);
}
});
また、Destroy ビューでタイマーをキャンセルすることを忘れないでください。
ビューページャーページを自動再生したいが、何よりも解決策は正しいが、最初のアイテムの自動再生後に遅延時間がかかるが、現在のアイテムの自動再生後にすぐに切り替える場合は間違っています。以下にコードを追加していますが、自動再生/一時停止が正しく機能しています。
@Override
public void onClick(View v) {
if (!isAutoPlay) {
img_autoplay.setImageResource(R.drawable.pause);
int currentcount = getModel().getCurrentIndex();
currentcount++;
getMainImage().setCurrentItem(currentcount);
autoPlay(getMainImage());
isAutoPlay = true;
} else {
img_autoplay.setImageResource(R.drawable.auto_play);
isAutoPlay = false;
}
}
});
そしてここに方法があります:
viewPager.postDelayed(new Runnable() {
@Override
public void run() {
try {
if (myAdapter != null
&& viewPager.getAdapter().getCount() > 0
&& isAutoPlay) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
int currentcount = getModel().getCurrentIndex();
currentcount++;
viewPager.setCurrentItem(currentcount);
if (getModel().isLastCard()) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
isAutoPlay = false;
packFinished();
getWindow()
.clearFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}, 6000);
}
autoPlay(viewPager);
}
} catch (Exception e) {
}
}
}, 6000);