3

Как заблокировать пейджинг в активности фрагментов viewpager для прокрутки фрагмента. Я выполняю некоторые операции с помощью progressbar в одном фрагменте. Если прогрессирующий прогресс-фрагмент получает изменения из-за прокрутки action.so при прогрессировании progressbar Я хочу прекратить прокручивать. Как это сделать? Есть ли какое-нибудь решение?Блокировать фрагмент страницы в ViewPager android

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; 
    } 
} 

ответ

2

Попробуйте установить интерактивными ложь:

mViewPager.setClickable(false); 

Если это работает, вы можете создать функцию в действии, чтобы отключить событие swipe на пейджере представления и вызвать эту функцию в фрагменте в случае показа индикатора выполнения и функцию для ее включения.

Подкласс ViewPager и переопределить onTouch событие, например:

EDIT

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); 
     } 
    } 
} 

ссылка: How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?

+0

это не working.while изменения прогресса страница получает swipe –

+0

проверить мой отредактированный ans –

+0

где я должен писать this.i не имеет какого-либо класса, который расширяет viewpager.if я помещаю это в класс MainFragmentActivity, о котором я упомянул выше, я получаю ошибку для onInterceptTouchEvent –

2

Я нашел простой способ сделать это, с адаптером.

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 (правда, страницы); Где страница - это индекс страницы, которую вы хотите заблокировать.

+0

- это самый лучший ответ, а не создание пользовательского viewpager, это гораздо более элегантно и просто ... – PirateApp

1

На основе решения Поля, я изменил его поддерживает отображение названий, а

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); 
Смежные вопросы