android - 以编程方式阻止 View 寻呼机中的页面滑动

标签 android android-fragments android-viewpager

我正在开发一个应用程序,用户可以在其中输入编辑文本中的内容,然后通过滑动屏幕进入下一个 View 。滑动操作由 viewpager 处理。

我想做的是:

只有当所有编辑文本都被填满时,用户才能滑动。目前,我所有的 edittexts 都有一个 TextWatcher,一旦每个字段都被填充,它就会将 bool 值设置为“true”。如果为真,我想启用 viewpager,如果不是,我想禁用它。

我正在使用带有三个 Fragment 的 CustomViewPager。我发布我的 CustomViewPager 代码:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Toast;

public class CustomViewPager extends ViewPager {

private boolean isPagingEnabled;
public Context context;
public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.isPagingEnabled = true;
    this.context = context;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (isPagingEnabled) {
        return super.onTouchEvent(event);
    }
    Toast.makeText(context, "Please fill in the details, then swipe !",
            Toast.LENGTH_LONG).show();
    return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (isPagingEnabled) {
        return super.onInterceptTouchEvent(event);

    }

    return false;
}

public void setPagingEnabled(boolean b) {
    isPagingEnabled = b;
}
}

PageViewActivity.java

public class PageViewActivity extends FragmentActivity {
    MyPageAdapter pageAdapter;
    int pageId=0;
    public static CustomViewPager pager;
    PageListener pageListener;
    int currentPage=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      List<Fragment> fragments = getFragments();
      pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
      pager =(CustomViewPager)findViewById(R.id.viewpager);



      pager.setAdapter(pageAdapter);
      pager.setPagingEnabled(false); 

      pageListener = new PageListener();

      pager.setOnPageChangeListener(pageListener);

    }

    private List<Fragment> getFragments(){
     List<Fragment> fList = new ArrayList<Fragment>();

     fList.add(MyFragmentA.newInstance("Fragment 1"));
     fList.add(MyFragmentB.newInstance("Fragment 2"));
     fList.add(MyFragmentC.newInstance("Fragment 3"));


     return fList;
    }

    public void next(View v){

        if(pageId<=2)
        {
        pager.setCurrentItem(pageId);
        }
        pageId++;
    }

    private class PageListener extends SimpleOnPageChangeListener{


        public void onPageSelected(int position) {
            Log.i("test", "onPageSelected " + position);
            currentPage = position;


         }

        //Called when the scroll state changes.
        public void onPageScrollStateChanged(int state)
        {

        }

        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
        {
        Log.i("test", "onPageScrolled " + position);
            currentPage = position;

        }
    }

}

我的页面适配器是这样的:

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.widget.Toast;

class MyPageAdapter extends FragmentPagerAdapter {
 private List<Fragment> fragments;

 public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
   super(fm);
   this.fragments = fragments;
 }
 @Override
 public Fragment getItem(int position) {
   return this.fragments.get(position);
 }

 @Override
 public int getCount() {
   return this.fragments.size();
 }
 
}

最后,我发布了一个包含唯一相关代码的 fragment :

public class MyFragmentA extends Fragment {
	
	EditText editname;
	public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
	
	
	public static final MyFragmentA newInstance(String message)
	{
	  MyFragmentA f = new MyFragmentA();
	  Bundle bdl = new Bundle(1);
	  bdl.putString(EXTRA_MESSAGE, message);
	  f.setArguments(bdl);
	  return f;
	}
	

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);
		
		
		editname = (EditText)myFragmentView.findViewById(R.id.name_input);
		
		editname.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                
            	if(editname.getText().toString().trim().length() == 0) {
            		
                    // Can I set here isPagingEnabled = false??
            		Toast.makeText(getActivity(), "SwipeFlag false!", Toast.LENGTH_SHORT).show();
            	
            	} else if(editname.getText().toString().trim().length() > 0) {
            		
                    // Can I set here isPagingEnabled = true??
            		Toast.makeText(getActivity(), "SwipeFlag true!",   Toast.LENGTH_SHORT).show();
            	
            	}
           }
            
        });
		
		return myFragmentView;
	}	
						
}

我知道阻止页面滑动的关键点是将标志“isPagingEnabled”设置为 false,但我不明白在运行时从 Fragment 设置它的最佳方法是什么。

最佳答案

好吧,我终于找到了一个解决方案,并将其发布在这里。阻止页面滑动的最佳方法是控制是否在 PageViewActivity.java(我的 MainActivity..)中的 onPageScrolled 内填充了编辑文本:

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        
     Log.i("test", "onPageScrolled - position = " + position);
        
     currentPage = position;
     txt1 = (EditText) findViewById(R.id.name_input);
            
     if(position == 0) {
           
         if(txt1.getText().toString().trim().length() == 0) {
            		
                pager.setCurrentItem(0);
            		
         } else if(txt1.getText().toString().trim().length() > 0) {
            	  
                // DO NOTHING
            	
         }
            
    }
}

以这种方式,在您的 fragment 的 edittext 字段被填充之前不允许页面滑动。

另一种阻止页面滑动的明智方法,但只有在正确的方向上,才能以这种方式修改 onPageSelected:

boolean inibitFlag = false;
int maxAllowedPage = 1; // .. or you can set this value in your fragment..
    	
public void onPageSelected(int position) {
     Log.i("test", "onPageSelected " + position);
            
     if(inibitFlag)
          return;
            
     if(position > maxAllowedPage) {

          inibitFlag = true;
          pager.setCurrentItem(currentPage);
          inibitFlag = false;

     } else {

          currentPage = position;
     }        
}

希望这对某人有帮助!!

关于android - 以编程方式阻止 View 寻呼机中的页面滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163578/

相关文章:

android - 如何在 NavigationView 上添加 Spinner

java - 无法再使用查询获取 Google Drive App Data 文件夹内容

android - AndEngine 游戏循环。它在哪里?

android - 如何重用已在 Navigation Drawer 上实例化的 fragment ?

java - setUserVisibleHint 中的空上下文

android - 如何从 url 加载多个图像到 viewpager

android - 在没有 BluetoothGATT 的情况下断开 BluetoothDevice

android - ViewPager 在第一页和最后一页重新加载 fragment

java - 子 fragment 的 getView 返回 null

java - 使用查看器页面在两个 fragment 之间切换 - 但是切换到 fragment 后它消失