Блокировать прокрутку страницы в программном обеспечении просмотра

62
7

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

Я хочу сделать следующее:

Пользователь должен иметь возможность прокручивать только после заполнения всех редакторов. В настоящее время все мои 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 {

EditText editname;
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";


public static final MyFragmentA newInstance(String message)
{
MyFragmentA f = new MyFragmentA();
Bundle bdl = new Bundle(1);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);


editname = (EditText)myFragmentView.findViewById(R.id.name_input);

editname.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

if(editname.getText().toString().trim().length() == 0) {

// Can I set here isPagingEnabled = false??
Toast.makeText(getActivity(), "SwipeFlag false!", Toast.LENGTH_SHORT).show();

} else if(editname.getText().toString().trim().length() > 0) {

// Can I set here isPagingEnabled = true??
Toast.makeText(getActivity(), "SwipeFlag true!", Toast.LENGTH_SHORT).show();

}
}

});

return myFragmentView;
}

}

Я знаю, что ключевой момент для блокировки страниц - это установить флаг "isPagingEnabled" в false, но я не могу понять, что является лучшим способом установить его из фрагмента во время выполнения.

спросил(а) 2021-01-19T17:51:05+03:00 2 месяца, 3 недели назад
1
Решение
87

Хорошо, я наконец нашел решение, и я разместил его здесь. Лучший способ заблокировать прокрутку страницы - это контролировать, если текст редактирования заполняется внутри onPageScrolled в PageViewActivity.java(my 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

}

}
}

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

Другой мудрый способ заблокировать прокрутку страницы, но ТОЛЬКО в правильном направлении - изменить onPageSelected таким образом:

boolean inibitFlag = false;
int maxAllowedPage = 1; // .. or you can set this value in your fragment..

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

Надеюсь, это поможет кому-то!

ответил(а) 2021-01-19T17:51:05+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема