我如何在片段滑动的ViewPager的片段活动中锁定分页。我在一个片段中使用progressbar执行某些操作。虽然Progress的ProgressBar片段会因滑动而发生变化。我想停止滑动进度键,该怎么做?有什么解决方案?
activity.xml文件 -
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainFragmentActivity" >
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="@drawable/title"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />
</android.support.v4.view.ViewPager>
片段活动 -
public class MainFragmentActivity extends FragmentActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
private Context mContext;
private PagerTitleStrip pt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(),mContext);
mContext=this;
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
pt=(PagerTitleStrip) findViewById(R.id.pager_title_strip);
}
sectionspageradapter-
public class SectionsPagerAdapter extends FragmentPagerAdapter {
Context mContext;
Fragment fragment;
public SectionsPagerAdapter(FragmentManager fm, Context context) {
super(fm);
mContext=context;
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
if(position==0){
fragment = new SelectItem();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
}
if(position==1){
fragment = new culation();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
}
if(position==2){
fragment = new GraphDisplay();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0 :
return "Select item";
case 1:
return "Calculation";
case 2:
return "Graph";
}
return null;
}
}
尝试将可单击的设置设置为false:
mViewPager.setClickable(false);
如果有效,您可以做的是在活动中创建一个函数,以在" Progress Bar Show"显示片段中禁用划线事件,并在片段中调用该功能。
子类ViewPager和Override OnTouch事件例如:
编辑
public class NonSwipeableViewPager extends ViewPager {
private boolean lock;
public void lock(){
lock=true;
}
public void unlock(){
lock=false;
}
public NonSwipeableViewPager(Context context) {
super(context);
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(lock)
return false;else{
return super.onTouchEvent(event);
}
}
}
参考:如何通过在ViewPager中刷手指来禁用分页,但仍然可以通过编程方式滑动?
我找到了一种简单的方法,它的适配器。
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* Created by paul.boldijar on 2/24/2015.
*/
public class SimpleFragmentAdapter extends FragmentPagerAdapter {
private Fragment[] fragments;
private boolean locked = false;
private int lockedIndex;
public void setLocked(boolean locked, int page) {
this.locked = locked;
lockedIndex = page;
notifyDataSetChanged();
}
public SimpleFragmentAdapter(FragmentManager fm, Fragment[] fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
if (locked) return fragments[lockedIndex];
return fragments[position];
}
@Override
public int getCount() {
if (locked) return 1;
return fragments.length;
}
}
如果要将片段锁定到页面上,只需调用fragment.setlocked(true,page);页面是您要锁定的页面的索引。
基于保罗的解决方案,我对其进行了修改以支持显示标题
public static class MainPagerAdapter extends FragmentStatePagerAdapter {
private Fragment[] fragments;
private String[] titles;
private boolean locked = false;
private int lockedIndex;
public MainPagerAdapter(FragmentManager fm, Fragment[] fragments, String[] titles) {
super(fm);
this.fragments = fragments;
this.titles = titles;
}
public void setLocked(boolean locked, int page) {
this.locked = locked;
lockedIndex = page;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
if (locked) return fragments[lockedIndex];
return fragments[position];
}
@Override
public int getCount() {
if (locked) return 1;
return fragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
if (locked) return titles[lockedIndex];
return titles[position];
}
}
我使用它的方式是说
Fragment[] fragments = {//Create fragment objects here...};
String[] titles = getResources().getStringArray(R.array.tabs);
MainPagerAdapter adapter = new MainPagerAdapter(getSupportFragmentManager(), fragments, titles);
adapter.setLocked(true, 0);
mPager.setAdapter(adapter);
您可以使用此视图:
https://github.com/mr-sarsarabi/lockableviewpager
它使您可以用一种方法锁定滑动手势: viewPager.setSwipeLocked(true);