Was ich versuche zu tun: Ich versuche, das Wischen im Pager programmgesteuert zu aktivieren / deaktivieren, wenn das Programm ausgeführt wird
Beispiel: Wenn ich im Flowtrue
bin,wenn ich nach einer Bedingungsucheund wenn sie zurückgibt,aktivieren Sie das Wischen, und wenn die Bedingung zurückgibt,false
deaktivieren Sie das Wischen.
Die Lösung, die ich benutze, ist diese
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
} }
Wählen Sie dann diesen anstelle des in XML integrierten Viewpagers aus
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Sie müssen nur die "setPagingEnabled" -Methode mit "false" aufrufen, und Benutzer können nicht zum Paginieren wischen.
Problem mit der obigen Methodik: Ich kann die Eigenschaft nicht für den Flow festlegen, I: e .... Ich kann entweder das Wischen aktivieren oder das Wischen deaktivieren. Aber ich kann dies nicht basierend auf der Bedingung tun
Frage:
- Kann ich mein Ziel auf andere Weise erreichen, wenn ja, was ist es?
- Oder ist das nicht möglich?
android
android-viewpager
Devrath
quelle
quelle
Antworten:
Deaktivieren Sie das Wischen progmatisch, indem Sie
final View touchView = findViewById(R.id.Pager); touchView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
und verwenden Sie dies, um manuell zu wischen
touchView.setCurrentItem(int index);
quelle
Beste Lösung für mich. - Zuerst erstellen Sie eine Klasse wie folgt:
public class CustomViewPager extends ViewPager { private Boolean disable = false; public CustomViewPager(Context context) { super(context); } public CustomViewPager(Context context, AttributeSet attrs){ super(context,attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return !disable && super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return !disable && super.onTouchEvent(event); } public void disableScroll(Boolean disable){ //When disable = true not work the scroll and when disble = false work the scroll this.disable = disable; } }
-Dann ändern Sie dies in Ihrem Layout:
<android.support.v4.view.ViewPager
dafür<com.mypackage.CustomViewPager
-Finally können Sie es deaktivieren:
view_pager.disableScroll(true);
oder aktivieren:view_pager.disableScroll(false);
Ich hoffe das hilft dir :)
quelle
disable == true
. ÜberschreibenonInterceptTouchEvent()
ist nicht die richtige Lösung.Überschreiben Sie diese Methoden in Ihrem benutzerdefinierten Ansichts-Pager-Adapter in
ViewPager
.@Override public boolean onInterceptTouchEvent(MotionEvent event) { // Never allow swiping to switch between pages return false; } @Override public boolean onTouchEvent(MotionEvent event) { // Never allow swiping to switch between pages return false; }
Zum Aktivieren geben Sie einfach jede
super
Methode zurück:super.onInterceptTouchEvent(event)
undsuper.onTouchEvent(event)
.quelle
Zum Deaktivieren des Wischens
mViewPager.beginFakeDrag();
Zum Aktivieren des Wischens
if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();
quelle
In meinem Fall hat die vereinfachte Lösung gut funktioniert. Die Überschreibungsmethode muss sich in Ihrem benutzerdefinierten Viewpager-Adapter befinden, um TouchEvent-Listener zu überschreiben und sie einzufrieren.
@Override public boolean onTouchEvent(MotionEvent event) { return this.enabled && super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return this.enabled && super.onInterceptTouchEvent(event); }
quelle
this.enabled == false
. ÜberschreibenonInterceptTouchEvent()
ist nicht die richtige Lösung.Ich habe eine andere Lösung gefunden, die für mich funktioniert hat. Folgen Sie diesem Link
https://stackoverflow.com/a/42687397/4559365
Grundsätzlich wird die Methode
canScrollHorizontally
zum Deaktivieren des Wischens mit dem Finger überschrieben. Wie auchsetCurrentItem
immer funktioniert immer noch.quelle
canScrollHorizontally()
Methode hat im aktuellen Szenario keine Auswirkung. Es wird nicht einmal aufgerufen, wenn ein Wischen stattfindet.Das hat bei mir funktioniert.
ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // disable swipe if(!swipeEnabled) { if (viewPager.getAdapter().getCount()>1) { viewPager.setCurrentItem(1); viewPager.setCurrentItem(0); } } } public void onPageScrollStateChanged(int state) {} public void onPageSelected(int position) {} }; viewPager.addOnPageChangeListener(onPageChangeListener);
quelle
Wenn Sie es erweitern möchten, nur weil Sie ein nicht wischbares Verhalten benötigen, müssen Sie es nicht tun. ViewPager2 bietet eine nette Eigenschaft namens:
isUserInputEnabled
quelle