2014-10-02 56 views
1

我正在开发一个应用程序,用户可以在edittexts中键入内容并通过滑动屏幕进入下一个视图。 swipe-stuff由viewpager处理。通过编程以块形式在视图页面中滑动页面编程

我想要做的是以下几点:

用户应该只能够在所有edittexts充满刷卡。目前我所有的编辑文本都有一个TextWatcher,一旦每个字段被填充,它就会将布尔值设置为“true”。当它是真的,我想启用viewpager,当它不是,我想禁用它。

我用三个片段使用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(); 
 
} 
 
    
 
}

最后我发表我的片段之一,唯一相关的代码:

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

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

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

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

回答

3

好吧,我终于找到了一个解决方案,我张贴在这里..阻止页面刷的最好办法是,如果编辑文本在PageViewActivity.java内部填充onPageScrolled控制(我的MainActivity ..):

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) { 
 
      \t \t 
 
       pager.setCurrentItem(0); 
 
      \t \t 
 
     } else if(txt1.getText().toString().trim().length() > 0) { 
 
      \t 
 
       // DO NOTHING 
 
      \t 
 
     } 
 
      
 
    } 
 
}

以这种方式页刷卡不允许,直到你的片段的EditText场被填满。

另一种明智的方法来阻止网页刷卡,但只有在正确的方向是修改使用onPageSelected这样:

boolean inibitFlag = false; 
 
int maxAllowedPage = 1; // .. or you can set this value in your fragment.. 
 
    \t 
 
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; 
 
    }   
 
}

希望这可以帮助别人!

相关问题