2017-03-19 62 views
0

嗨,經過多次研究,我不知道如何解決我的問題。在我的情況下,我嘗試了很多東西,沒有任何工作。有一個解決方案,或者我應該考慮另一種方式來完成我的任務(簡單地說,我從來沒有想過)。Android:單擊viewpager頁面時停止計時器

上下文:我有一個ViewPager的MainActivity以獲得最佳的片段管理。 viewpager的第一個片段包含另一個viewpager,它爲ArrayList中的每個對象實例化一個新片段。 帶有viewpager的片段有一個定時器(有兩種方法啓動/停止定時器),用於每3/4秒自動滾動viewpager的頁面。

我想做什麼:當用戶點擊viewpager頁面上的任意位置時,我想停止計時器,當用戶滾動下一頁時,計時器重新啓動。

我的問題:我試圖得到選定的頁面,並在片段的視圖上添加onclicklistener,但所選頁面(片段對象)返回null。我嘗試從OnCreateView中viewpager中的片段調用stopTimer()方法(獲取父片段並調用方法),但父片段也返回null。我試過的所有東西都有NullPointerException。

我在Paint上做了一個模式來試圖向你解釋上下文。

Context schema

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()方法。

對不起,我試着寫出最正確的答案。 感謝您花時間回答我的問題。

回答

0

嘗試在片段的根佈局上設置setOnClickListener!我認爲Hanlder.postdelay比定時器更好

+0

哪個片段的根佈局:有viewpager的還是viewpager包含的?我會看到處理程序,目前定時器工作正常。 –

+0

我試圖在包含viewpager的片段的根視圖,它不起作用。點擊不會被解僱。 –