锁定页面片段在ViewPager Android中



我如何在片段滑动的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);

最新更新