2017-05-31 7 views
0

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.

Antwort

1

Deaktivieren Sie die Swipe zwischen Fragment

viewPager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return true; 
      } 
     }); 

Hoffnung diese Informationen helfen Ihnen

+0

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 –

Verwandte Themen