Ich habe einen ViewPager implementiert, um zwischen Fragmenten zu wischen. Das Problem ist, dass ich die Paginierung deaktivieren möchte, bis eine bestimmte Bedingung erfüllt ist. Der Code, den ich Ihnen unten zeige, funktioniert fast gut, aber das vertikale Scrollen im Layout des Fragments wird nicht zugelassen, und ich möchte nur die horizontale Scrollfunktion deaktivieren, also den Übergang zwischen Fragmenten.Horizontales Scrollen in einem Fragment deaktivieren
Ich habe ein Layout, das einen benutzerdefinierten ViewPager wie folgt enthält:
layout_pager
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical" tools:context=".MyActivity">
<mypackage.CustomViewPager android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
und ein anderes Layout den Inhalt des Fragments zu definieren, die eine Scroll implementiert:
layout_fragment
Die Aktivität zuzuordnen einfach den Adapter
MyActivity
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_pager);
CustomViewPager viewPager = (CusotmViewPager) findViewById(R.id.viewpager);
CustomAdapter adapter = new CustomAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
}
}
Die CustomViewPager hat ein Flag, um anzuzeigen, wenn sie die Paginierung erlaubt ist
CustomViewPager
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
enabled = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return enabled ? super.onInterceptTouchEvent(ev) : false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return enabled ? super.onTouchEvent(event) : false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
}
Schließlich fängt das Fragment Berührungsereignisse ab, um zu prüfen, ob die Bedingung erfüllt ist, um die Paginierung zu aktivieren.
MyFragment
public class MyFragment extends Fragment {
public MyFragment() {}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.layout_fragment, container, false);
final MyActivity myActivity = (MyActivity) getActivity();
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_DOWN) {
View customViewPagerRoot = myActivity.findViewById(R.id.viewpager);
CustomViewPager viewPager = (CustomViewPager) customViewPagerRoot.findViewById(R.id.viewpager);
if (condition to allow the pagination) {
viewPager.setPagingEnabled(true);
} else {
viewPager.setPagingEnabled(false);
}
}
return true;
}
});
return rootView;
}
}
ich hoffe ich das Problem richtig erklärt haben, wäre jede Hilfe dankbar.
Ihre Lösung das Problem der vertikalen Bildlauf fixiert, aber jetzt trotz der Swipe zwischen Fragmenten disallowing, bewegt sich der Bildschirm nach und nach in Richtung das nächste Fragment –