1

У меня есть активность, которая управляет экземплярами некоторых последовательных фрагментов и ViewPager, чей адаптер имеет тип FragmentStatePagerAdapter. Эти фрагменты являются последовательными, потому что я хочу создать своего рода мастер, которым должны следовать люди. Все работает нормально, но я хочу отключить прокрутку, когда пользователь хочет перейти на следующую страницу (фрагмент) мастера, если он не заполнил все поля на текущей странице.Android - отключить прямой сабпер при неверно заполненных данных

package edu.polimi.dima.home121; 


import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.ActionBarActivity; 

import edu.polimi.dima.home121.model.Place; 

/** 
* Created by leo on 13/01/2015. 
*/ 
public class NewPlaceActivity extends ActionBarActivity 
     implements NewPlaceSummaryFragment.OnFragmentInteractionListener, 
     NewPlaceWizardFirstStepFragment.OnFragmentInteractionListener, 
     NewPlaceWizardSecondStepFragment.OnFragmentInteractionListener, 
     NewPlaceWizardThirdStepFragment.OnFragmentInteractionListener, 
     NewPlaceWizardFourthStepFragment.OnFragmentInteractionListener { 

    private final String TAG = getClass().getSimpleName(); 
    private static Place place; 

    private static final int NUM_PAGES = 7; 
    private ViewPager mPager; 
    private PagerAdapter mPagerAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     place = new Place(); 
     setContentView(R.layout.activity_new_place); 

     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), mPager, place); 
     mPager.setAdapter(mPagerAdapter); 
     /*if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.newPlaceContainer, NewPlaceSummaryFragment.newInstance(place)) 
        .commit(); 
     }*/ 
    } 

    @Override 
    public void onBackPressed() { 
     if (mPager.getCurrentItem() == 0) { 
      // If the user is currently looking at the first step, allow the system to handle the 
      // Back button. This calls finish() on this activity and pops the back stack. 
      super.onBackPressed(); 
     } else { 
      // Otherwise, select the previous step. 
      mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
     } 
    } 

    @Override 
    public void onFragmentInteraction(Uri uri) { 
    } 

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     private Place place; 
     private ViewPager mPager; 

     public ScreenSlidePagerAdapter(FragmentManager fm, ViewPager mPager, Place place) { 
      super(fm); 
      this.place = place; 
      this.mPager = mPager; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new NewPlace0(); 
       case 1: 
        NewPlaceWizardFirstStepFragment f1 = new NewPlaceWizardFirstStepFragment().newInstance(place); 
        f1.setPager(mPager); 
        return f1; 
       case 2: 
        NewPlaceWizardSecondStepFragment f2 = new NewPlaceWizardSecondStepFragment().newInstance(place); 
        f2.setPager(mPager); 
        return f2; 
       case 3: 
        NewPlaceWizardThirdStepFragment f3 = new NewPlaceWizardThirdStepFragment().newInstance(place); 
        f3.setPager(mPager); 
        return f3; 
       case 4: 
        NewPlaceWizardFourthStepFragment f4 = new NewPlaceWizardFourthStepFragment().newInstance(place); 
        f4.setPager(mPager); 
        return f4; 
       case 5: 
        NewPlace99 f5 = new NewPlace99(); 
        return f5; 
       case 6: 
        NewPlaceSaving last = NewPlaceSaving.newInstance(place); 
        return last; 
       default: 
        return null; 
      } 

     } 

     @Override 
     public int getCount() { 
      //TODO sistemare il conteggio delle pagine 
      return NUM_PAGES; 
     } 
    } 
} 

Например, первый фрагмент у меня есть:

public class NewPlaceWizardFirstStepFragment extends Fragment implements View.OnClickListener, 
     DialogInterface.OnClickListener { 

    private final String TAG = this.getClass().getSimpleName(); 

    private static Place place; 
    private OnFragmentInteractionListener mListener; 
    private static View view; 
    private ViewPager pager; 

    public NewPlaceWizardFirstStepFragment() { 
    } 

    private TextView lblAvailableFrom; 
    private Button btnSingleRoom; 
    private Button btnDoubleRoom; 
    private Button btnStudioFlat; 
    private Button btnApartment; 
    private Button btnChangeDate; 
    private Button btnNext; 
    private EditText tfStreet; 
    private EditText tfCivic; 
    private EditText tfStair; 
    private EditText tfFloor; 
    private EditText tfCity; 
    private EditText tfPostalCode; 

    public static NewPlaceWizardFirstStepFragment newInstance(Place place) { 
     NewPlaceWizardFirstStepFragment fragment = new NewPlaceWizardFirstStepFragment(); 
     fragment.place = place; 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_new_place_wizard_first_step, container, false); 
     setupUI(); 
     return view; 
    } 

    public void setupUI() { 
     btnNext = (Button) view.findViewById(R.id.btnNext); 
     btnNext.setOnClickListener(this); 
     btnSingleRoom = (Button) view.findViewById(R.id.btnSingleRoom); 
     btnSingleRoom.setOnClickListener(this); 
     btnDoubleRoom = (Button) view.findViewById(R.id.btnDoubleRoom); 
     btnDoubleRoom.setOnClickListener(this); 
     btnStudioFlat = (Button) view.findViewById(R.id.btnStudioFlat); 
     btnStudioFlat.setOnClickListener(this); 
     btnApartment = (Button) view.findViewById(R.id.btnApartment); 
     btnApartment.setOnClickListener(this); 
     btnChangeDate = (Button) view.findViewById(R.id.changeDate); 
     btnChangeDate.setOnClickListener(this); 
     lblAvailableFrom = (TextView) view.findViewById(R.id.lblAvailableFrom); 
     tfStreet = (EditText) view.findViewById(R.id.tfStreet); 
     tfCivic = (EditText) view.findViewById(R.id.tfCivic); 
     tfStair = (EditText) view.findViewById(R.id.tfStair); 
     tfFloor = (EditText) view.findViewById(R.id.tfFloor); 
     tfCity = (EditText) view.findViewById(R.id.tfCity); 
     tfPostalCode = (EditText) view.findViewById(R.id.tfPostalAddress); 
    } 

    AlertDialog availableFromDialog; 

    private boolean enoughDataToContinue() { 
     boolean ret = true; 
     ret &= tfStreet.getText().length() != 0; 
     ret &= tfCivic.getText().length() != 0; 
     ret &= tfCity.getText().length() != 0; 
     return ret; 
    } 

    private void collectUserData() { 
     Address a = new Address(); 
     a.setStreet(String.valueOf(tfStreet.getText())); 
     a.setNumber(String.valueOf(tfCivic.getText())); 
     a.setFloor(String.valueOf(tfFloor.getText())); 
     a.setStair(String.valueOf(tfStair.getText())); 
     a.setCity(String.valueOf(tfCity.getText())); 
     a.setPostalCode(String.valueOf(tfPostalCode.getText())); 
     place.setApartment(new Apartment()); 
     place.getApartment().setAddress(a); 
     MiscServices.setCoordinates(place.getApartment()); 
     Log.d(TAG, "first step done:" + new ObjectMapper().convertValue(place, Map.class).toString()); 
    } 

    //TODO aggionare il toast 
    private void notifyUserOfInputIssues() { 
     Toast.makeText(getActivity().getApplicationContext(), "Complete all the fields to continue", 
       Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btnNext: 
       if (enoughDataToContinue()) { 
        collectUserData(); 
        pager.setCurrentItem(pager.getCurrentItem() + 1, true); 
       } 
       else 
        notifyUserOfInputIssues(); 
       break; 
      case R.id.changeDate: 
       AvailableFromDialogBuilder availableFromDialogBuilder = new AvailableFromDialogBuilder(getActivity()); 
       if (place.getAvailableFrom() != null) 
        availableFromDialogBuilder.setValue(place.getAvailableFrom()); 
       availableFromDialogBuilder.setPositiveButton(R.string.my_continue, this); 
       availableFromDialog = availableFromDialogBuilder.show(); 
       break; 
      case R.id.btnSingleRoom: 
       Log.v(TAG, "SingleRoom pressed"); 
       clearSelection(); 
       btnSingleRoom.setSelected(true); 
       place.setAccomodationType(Place.SINGLE_ROOM); 
       break; 
      case R.id.btnDoubleRoom: 
       Log.v(TAG, "DoubleRoom pressed"); 
       clearSelection(); 
       btnDoubleRoom.setSelected(true); 
       place.setAccomodationType(Place.DOUBLE_ROOM); 
       break; 
      case R.id.btnApartment: 
       Log.v(TAG, "Apartment pressed"); 
       clearSelection(); 
       btnApartment.setSelected(true); 
       place.setAccomodationType(Place.STANDARD_RENT); 
       break; 
      case R.id.btnStudioFlat: 
       Log.v(TAG, "StudioFlat pressed"); 
       clearSelection(); 
       btnStudioFlat.setSelected(true); 
       place.setAccomodationType(Place.STUDIO_FLAT); 
       break; 
      default: 
       Log.e(TAG, getResources().getString(R.string.error_ID) + v.getId()); 
     } 
    } 

    public void clearSelection() { 
     btnApartment.setSelected(false); 
     btnSingleRoom.setSelected(false); 
     btnDoubleRoom.setSelected(false); 
     btnStudioFlat.setSelected(false); 
    } 

    ; 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     if (dialog == availableFromDialog) { 
      DatePicker datePicker = (DatePicker) availableFromDialog.findViewById(R.id.dpAvailableFrom); 
      Calendar cal = Calendar.getInstance(); 
      cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); 
      cal.set(Calendar.MONTH, datePicker.getMonth()); 
      cal.set(Calendar.YEAR, datePicker.getYear()); 
      place.setAvailableFrom(cal.getTime()); 
      lblAvailableFrom.setText(datePicker.getDayOfMonth() + " - " + cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, getResources().getConfiguration().locale) + " - " + datePicker.getYear()); 
     } else Log.e(TAG, getResources().getString(R.string.error_dialog)); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public void setPager(ViewPager pager) { 
     this.pager = pager; 
    } 

    public ViewPager getPager() { 
     return pager; 
    } 

    public interface OnFragmentInteractionListener { 
     // TODO: valutare se serve 
     public void onFragmentInteraction(Uri uri); 
    } 
} 

Как отключить прикосновение к следующему фрагменту (справа налево), даже если назад коромысло (слева направо) должно быть всегда включен?

+0

это поможет вам http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s – Abhishek

ответ

1

Во-первых, небольшой совет; Для каждого из следующих строк, нет необходимости нового, так как метод является статическим:

NewPlaceWizardFirstStepFragment f1 = NewPlaceWizardFirstStepFragment.newInstance(place); 

То есть, я бы, наверное, просто добавить логику к адаптеру пейджера, чтобы ограничить количество по количеству завершенных страницы. т. е. если вы на шаге 4, счет равен 4. По завершении шага 4 увеличивайте счетчик, чтобы позволить пользователю пронести следующий фрагмент.

Смотрите этот стек переполнения пост для примера:

ViewPager disable swiping to a certain direction

0

Лучший способ заблокировать страницу салфетки, чтобы контролировать, если редактировать текст заполнен внутри 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) {     
      pager.setCurrentItem(0); 

    } else if(txt1.getText().toString().trim().length() > 0) {    
      // DO NOTHING    
    }    
} 
} 
Смежные вопросы