0

I created a view pager that controls four fragments. But I want to disabled swiping by finger. I want to lock swipe and use button click to navigate to the next fragment or previous fragment. But all my trial codes gotten from research proved wrong. Please how do I disable swiping completely and introduce a button to enable me to navigate to the

This is SimpleFragmentPageAdapter

public class SimpleFragmentPageAdapter extends FragmentPagerAdapter {
    private String[] tabtitle=new String[]{"Page1","Page2","Page3","Page4",};
    Context context;
    private int pagecount=4;
    public SimpleFragmentPageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context=context;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: //Fragment # 0 - This will show DevelopersFragment
                return Page1Fragment.newInstance(0, "page # 0");
            case 1: //Fragment # 0 - This will show Page1Fragment
                return Page2Fragment.newInstance(1, "Page # 1");
            case 2: //Fragment # 0 - This will show Page2Fragment
                return Page3Fragment.newInstance(2, "Page # 2");
            case 3: //Fragment # 0 - This will show Page3Fragment
                return Page4Fragment.newInstance(3, "Page # 3");
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return pagecount;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return "woliwo" + position;
    }
}

This is Main1Activity.java

public class Main1Activity extends AppCompatActivity {

    Toolbar toolbar;
    TabLayout tabLayout;
    ViewPager viewPager;
    Button Tips3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the start page passed to us or default to first page
        Intent mIntent = getIntent();
        int startPage = mIntent.getIntExtra("startPage", 0);
        setContentView(R.layout.activity_main1);

        toolbar = findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);


        ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setAdapter(new SimpleFragmentPageAdapter(getSupportFragmentManager(), this));
        // set the current page to the start page
        viewPager.setCurrentItem(startPage);


        //Attach the page change listener inside the activity
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            // This method will be invoked when a new page becomes selected
            @Override
            public void onPageSelected(int position) {
                Toast.makeText(Main1Activity.this, "bool:" + position, Toast.LENGTH_SHORT).show();
            }

            // This method will be invoked when the current page is scrolled
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetpixels) {

            }

            // Called when the scroll state changes:
            //SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);


    }
    
}

This is what I tried that gave 1% motion event disability

final View touchView = findViewById(R.id.view_pager);
        touchView.setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                return true;
            }
        });

This is the ViewPager class Main1Activity.java This below is how I did it and it show nothing please correct me

public class Main1Activity extends AppCompatActivity {

    Toolbar toolbar;
    TabLayout tabLayout;
    ViewPager viewPager;
    Button Tips3;

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

        toolbar = findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);


        CustomViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });


        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.tool_item_menu1, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.item0:
                Toast.makeText(this, "Home Selected", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Main1Activity.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                finish();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }

    }



}
davidigbogree
  • 59
  • 1
  • 8
  • 1
    ViewPager is deprecated, start using ViewPager2. This feature can be easily added using ViewPager2 with just one line of code, and it is more easier then ViewPager. And this answer is available for both ViewPager and ViewPager2 here. [ https://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s ] – Rajasekhar Sep 19 '20 at 10:17

1 Answers1

3

You can use ViewPager2 as mentioned in the comment above by https://stackoverflow.com/users/7725103/rajasekhar, but if you really need to use a viewpager: then you will have to create a custom viewpager like this:

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import androidx.viewpager.widget.ViewPager;

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

Usage

 <com.yourpackagename.CustomViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/tab_layout"/>

Finally : In the class you are using the viewpager:

 CustomViewPager viewPager=findViewById(R.id.view_pager);
     viewPager.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return false;
                }
            });

This Solution is for those using ViewPager2

Set you Layout thus:

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/tab_layout"/>

And then set the class thus: No matter the way you code just placing this viewPager2.setUserInputEnabled(false); disables swiping effects

ViewPager2 viewPager2 = findViewById(R.id.viewPager);
        viewPager2.setAdapter(new SimpleFragmentPagerAdapter(this));
        viewPager2.setUserInputEnabled(false);

Goodluck!

davidigbogree
  • 59
  • 1
  • 8
Daniel Alome
  • 101
  • 1
  • 8