2014-10-02 6 views
1

Я разрабатываю приложение, в котором пользователь может вводить материал в edittexts и перейти к следующему виду, прокручивая экран. Просеиватель обрабатывается viewpager.Заблокировать страницу в представлении пейджера программно

То, что я хочу сделать, это следующее:

Пользователь должен только быть в состоянии ударить, когда все edittexts заполнены. В настоящее время все мои edittexts имеют TextWatcher, который устанавливает логическое значение в значение «true» после заполнения каждого поля. Когда это правда, я хочу включить viewpager, когда это не так, я хочу отключить его.

Я использую CustomViewPager с тремя фрагментами. Я отправляю мой код CustomViewPager:

import android.content.Context; 
import android.support.v4.view.ViewPager; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.Toast; 

public class CustomViewPager extends ViewPager { 

private boolean isPagingEnabled; 
public Context context; 
public CustomViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.isPagingEnabled = true; 
    this.context = context; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (isPagingEnabled) { 
     return super.onTouchEvent(event); 
    } 
    Toast.makeText(context, "Please fill in the details, then swipe !", 
      Toast.LENGTH_LONG).show(); 
    return false; 
} 
@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (isPagingEnabled) { 
     return super.onInterceptTouchEvent(event); 

    } 

    return false; 
} 

public void setPagingEnabled(boolean b) { 
    isPagingEnabled = b; 
} 
} 

PageViewActivity.java

public class PageViewActivity extends FragmentActivity { 
    MyPageAdapter pageAdapter; 
    int pageId=0; 
    public static CustomViewPager pager; 
    PageListener pageListener; 
    int currentPage=0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     List<Fragment> fragments = getFragments(); 
     pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 
     pager =(CustomViewPager)findViewById(R.id.viewpager); 



     pager.setAdapter(pageAdapter); 
     pager.setPagingEnabled(false); 

     pageListener = new PageListener(); 

     pager.setOnPageChangeListener(pageListener); 

    } 

    private List<Fragment> getFragments(){ 
    List<Fragment> fList = new ArrayList<Fragment>(); 

    fList.add(MyFragmentA.newInstance("Fragment 1")); 
    fList.add(MyFragmentB.newInstance("Fragment 2")); 
    fList.add(MyFragmentC.newInstance("Fragment 3")); 


    return fList; 
    } 

    public void next(View v){ 

     if(pageId<=2) 
     { 
     pager.setCurrentItem(pageId); 
     } 
     pageId++; 
    } 

    private class PageListener extends SimpleOnPageChangeListener{ 


     public void onPageSelected(int position) { 
      Log.i("test", "onPageSelected " + position); 
      currentPage = position; 


     } 

     //Called when the scroll state changes. 
     public void onPageScrollStateChanged(int state) 
     { 

     } 

     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
     { 
     Log.i("test", "onPageScrolled " + position); 
      currentPage = position; 

     } 
    } 

} 

Моя страница адаптер это:

import java.util.List; 
 

 
import android.support.v4.app.Fragment; 
 
import android.support.v4.app.FragmentManager; 
 
import android.support.v4.app.FragmentPagerAdapter; 
 
import android.widget.Toast; 
 

 
class MyPageAdapter extends FragmentPagerAdapter { 
 
private List<Fragment> fragments; 
 

 
public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { 
 
    super(fm); 
 
    this.fragments = fragments; 
 
} 
 
@Override 
 
public Fragment getItem(int position) { 
 
    return this.fragments.get(position); 
 
} 
 

 
@Override 
 
public int getCount() { 
 
    return this.fragments.size(); 
 
} 
 
    
 
}

Наконец я выкладываю один из моих фрагментов с только соответствующий код:

public class MyFragmentA extends Fragment { 
 
\t 
 
\t EditText editname; 
 
\t public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 
 
\t 
 
\t 
 
\t public static final MyFragmentA newInstance(String message) 
 
\t { 
 
\t MyFragmentA f = new MyFragmentA(); 
 
\t Bundle bdl = new Bundle(1); 
 
\t bdl.putString(EXTRA_MESSAGE, message); 
 
\t f.setArguments(bdl); 
 
\t return f; 
 
\t } 
 
\t 
 

 
\t @Override 
 
\t public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
 
\t \t View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false); 
 
\t \t 
 
\t \t 
 
\t \t editname = (EditText)myFragmentView.findViewById(R.id.name_input); 
 
\t \t 
 
\t \t editname.setOnClickListener(new OnClickListener() { 
 

 
      @Override 
 
      public void onClick(View v) { 
 
       
 
      \t if(editname.getText().toString().trim().length() == 0) { 
 
      \t \t 
 
        // Can I set here isPagingEnabled = false?? 
 
      \t \t Toast.makeText(getActivity(), "SwipeFlag false!", Toast.LENGTH_SHORT).show(); 
 
      \t 
 
      \t } else if(editname.getText().toString().trim().length() > 0) { 
 
      \t \t 
 
        // Can I set here isPagingEnabled = true?? 
 
      \t \t Toast.makeText(getActivity(), "SwipeFlag true!", Toast.LENGTH_SHORT).show(); 
 
      \t 
 
      \t } 
 
      } 
 
      
 
     }); 
 
\t \t 
 
\t \t return myFragmentView; 
 
\t } \t 
 
\t \t \t \t \t \t 
 
}

Я знаю, что Keypoint блокировать страницу красть, чтобы установить флаг «isPagingEnabled» ложь, но я не могу понять, что это лучший способ, чтобы установить его из фрагмента во время выполнения.

ответ

3

Хорошо, я, наконец, нашел решение, и я его здесь .. Лучший способ заблокировать страницу салфетки, чтобы контролировать, если редактировать текст заполнен внутри onPageScrolled в PageViewActivity.java (мой MainActivity ..):

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
 
     
 
    Log.i("test", "onPageScrolled - position = " + position); 
 
     
 
    currentPage = position; 
 
    txt1 = (EditText) findViewById(R.id.name_input); 
 
      
 
    if(position == 0) { 
 
      
 
     if(txt1.getText().toString().trim().length() == 0) { 
 
      \t \t 
 
       pager.setCurrentItem(0); 
 
      \t \t 
 
     } else if(txt1.getText().toString().trim().length() > 0) { 
 
      \t 
 
       // DO NOTHING 
 
      \t 
 
     } 
 
      
 
    } 
 
}

В этом пути странице взмахе не допускается до тех пор, EditText поле вашего фрагмента не будет заполнено.

Другого мудрым способ блокировать страницы красть, но только в правильном направлении, чтобы изменить onPageSelected таким образом:

boolean inibitFlag = false; 
 
int maxAllowedPage = 1; // .. or you can set this value in your fragment.. 
 
    \t 
 
public void onPageSelected(int position) { 
 
    Log.i("test", "onPageSelected " + position); 
 
      
 
    if(inibitFlag) 
 
      return; 
 
      
 
    if(position > maxAllowedPage) { 
 

 
      inibitFlag = true; 
 
      pager.setCurrentItem(currentPage); 
 
      inibitFlag = false; 
 

 
    } else { 
 

 
      currentPage = position; 
 
    }   
 
}

Надеется, что это помогает кто-то !!

Смежные вопросы