嗨,經過多次研究,我不知道如何解決我的問題。在我的情況下,我嘗試了很多東西,沒有任何工作。有一個解決方案,或者我應該考慮另一種方式來完成我的任務(簡單地說,我從來沒有想過)。Android:單擊viewpager頁面時停止計時器
上下文:我有一個ViewPager的MainActivity以獲得最佳的片段管理。 viewpager的第一個片段包含另一個viewpager,它爲ArrayList中的每個對象實例化一個新片段。 帶有viewpager的片段有一個定時器(有兩種方法啓動/停止定時器),用於每3/4秒自動滾動viewpager的頁面。
我想做什麼:當用戶點擊viewpager頁面上的任意位置時,我想停止計時器,當用戶滾動下一頁時,計時器重新啓動。
我的問題:我試圖得到選定的頁面,並在片段的視圖上添加onclicklistener,但所選頁面(片段對象)返回null。我嘗試從OnCreateView中viewpager中的片段調用stopTimer()方法(獲取父片段並調用方法),但父片段也返回null。我試過的所有東西都有NullPointerException。
我在Paint上做了一個模式來試圖向你解釋上下文。
public class FeedViewerFragment extends Fragment {
private static final int SWITCH_PERIOD = 3000;
Timer timer;
int page = 0;
private FeedViewPager mViewPager;
private FeedPagerAdapter mViewPagerAdapter;
private ArrayList<User> users;
private TimerTask timerTask;
private Handler handler = new Handler();
private boolean timerIsRunning;
private FeedViewerFragment thisInstance;
public static final FeedViewerFragment newInstance(ArrayList<User> users) {
FeedViewerFragment f = new FeedViewerFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("feed_users", users);
f.setArguments(bundle);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.users = (ArrayList<User>) getArguments().getSerializable("feed_users");
this.thisInstance = this;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_feed_viewer, container, false);
mViewPagerAdapter = new FeedPagerAdapter(getFragmentManager(), users);
mViewPager = (FeedViewPager) view.findViewById(R.id.fragment_view_feed_viewpager);
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setAllowedSwipeDirection(SwipeDirection.right);
startTimer();
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (!timerIsRunning)
startTimer();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
return view;
}
private void startTimer() {
timer = new Timer();
initializeTimerTask();
timer.schedule(timerTask, 1500, SWITCH_PERIOD); //
}
public void stopTimer() {
timer.cancel();
timerIsRunning = false;
}
private void initializeTimerTask() {
timerTask = new TimerTask() {
public void run() {
timerIsRunning = true;
handler.post(new Runnable() {
public void run() {
if (page > mViewPagerAdapter.getCount()) {
page = 0;
mViewPager.setCurrentItem(page);
} else {
mViewPager.setCurrentItem(page++);
}
}
});
}
};
}
private class FeedPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<User> users;
public FeedPagerAdapter(FragmentManager fm, ArrayList<User> users) {
super(fm);
this.users = users;
}
@Override
public Fragment getItem(int position) {
return FeedProfileFragment.newInstance(this.users.get(position));
}
@Override
public int getCount() {
return users.size();
}
}
}
以上,這是從在MainActivity的viewpager其中包含了定時器自動滾動他viewpager第一個片段。我想在用戶點擊viewpager的當前頁面時調用stopTimer()方法。
對不起,我試着寫出最正確的答案。 感謝您花時間回答我的問題。
哪個片段的根佈局:有viewpager的還是viewpager包含的?我會看到處理程序,目前定時器工作正常。 –
我試圖在包含viewpager的片段的根視圖,它不起作用。點擊不會被解僱。 –