it-swarm.com.de

wie kann ich den Viewpager-Adapter deaktivieren, wenn er bestimmte Ansichten berührt?

Ich habe einen Viewpager, der zwischen den Registerkarten wechselt, wenn Sie nach links/rechts streichen. In meinem zweiten Tab habe ich einige benutzerdefinierte Ansichten, die Zuhörer zum Kneifen und Ziehen enthalten.

Eine Lösung für mich ist, das Wischen beim Berühren dieser spezifischen Ansichten zu deaktivieren und nur beim Wischen außerhalb dieser Ansichten zu streichen. Ist dies möglich?

Aktualisiert: @ Asok stellte freundlicherweise die Lösung bereit. Aber dann den Code aktualisiert, der in meinem Fall nicht funktionieren würde, so poste ich den vorherigen Code, der für mich funktionierte:

public class CustomViewPager extends ViewPager {
private boolean swipeable = true;

public CustomViewPager(Context context) {
    super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

// Call this method in your motion events when you want to disable or enable
// It should work as desired.
public void setSwipeable(boolean swipeable) {
    this.swipeable = swipeable;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
    return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false;
}

Nehmen wir an, ich habe eine ziehbare Ansicht, und ich muss das Swipping beim Ziehen des Starts deaktivieren und erneut aktivieren, wenn das Ziehen fertig ist, also im TouchEvent meiner sogenannten Ansicht:

    @Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
    case MotionEvent.ACTION_DOWN:
//disable swiping when the button is touched
((ActivityOriginal) getActivity()).setSwipeable(false);
//the rest of the code...
        break;
    case MotionEvent.ACTION_MOVE:

        break;
    case MotionEvent.ACTION_UP:
//re enable swipping when the touch is stopped
//the rest of the code...
((ActivityOriginal) getActivity()).setSwipeable(true);
        break;
    }
    return true;
}
25
Mehdi Fanai

Das erste, was mir in den Sinn kommt, ist ein benutzerdefiniertes ViewPager, bei dem, wenn Ihre Touch-Listener über ein bestimmtes Ereignis benachrichtigt werden, das swipeableboolean in ViewPager auf "false" gesetzt und auf "true" gesetzt werden kann .

public class CustomViewPager extends ViewPager {
    private boolean swipeable = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // Call this method in your motion events when you want to disable or enable
    // It should work as desired.
    public void setSwipeable(boolean swipeable) {
        this.swipeable = swipeable;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false; 
    }

}

Stellen Sie sicher, dass Sie Ihre Layout-Datei ändern, um Folgendes anzuzeigen:

<com.your.package.CustomViewPager .. />

Anstatt:

<Android.support.v4.view.ViewPager .. />

Bearbeiten 2

Hier ist mein Setup (Arbeiten mit dem obigen CustomViewPager):

CustomViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the CustomViewPager with the sections adapter.
    mViewPager = (CustomViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }
    });

    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }

}

public void swipeOn(View v) {
    mViewPager.setSwipeable(true);
}

public void swipeOff(View v) {
    mViewPager.setSwipeable(false);
}

Das oben gezeigte onCreate befindet sich in meiner MainActivity-Klasse, die FragmentActivity erweitert und ActionBar.TabListener implementiert.

34
jnthnjns

Ich verwende requestDisallowInterceptTouchEvent (true) int den onTouchEvent-Listener der Ansicht, die auch Ziehereignisse enthält.

@Override
public boolean onTouchEvent(MotionEvent event) {

    ViewParent parent = getParent(); 
    // or get a reference to the ViewPager and cast it to ViewParent

    parent.requestDisallowInterceptTouchEvent(true);

    // let this view deal with the event or
    return super.onTouchEvent(event);
}
32
Tiago A.

Ich benutze so

public void setSwipeable(boolean swipeable)
{
    this.swipeable = swipeable;
}

@Override
public void scrollTo(int x, int y){
    if (swipeable){
        super.scrollTo(x, y);
    }
}
0
ray

Wenn Sie die Positionen kennen, an denen Sie Berührungsereignisse im Ansichts-Pager nicht abfangen möchten, können Sie dies wie ich tun. 

 @Override
 public boolean onInterceptTouchEvent(MotionEvent arg0) {
    if(arg0.getY()>getHeight()/2)return false;
    return super.onInterceptTouchEvent(arg0);
}
0
Ankit Gaur