您的位置:首页 > 移动开发 > Android开发

viewpager+fragment

2016-03-14 18:12 393 查看
公司的app新功能迭代,这次是个大版本上线,自己也负责了好几个部分的开发.今天基本上处于开发完测试接手的时间了,现在就自己的开发中所遇的一些技术点总结一下,主要是代码控件方面的,由于技术水平差还不能达到构架层次的水平.
viewpager+fragmeng
在在app的业务层中,有个UI设计是界面中(不好意思由于是商业app所以不能轻易上传公司的设计方案)顶部有两个Button,会根据Button展现不同的界面,界面上会有各自的操作,在toolsBar上有个保存钮,
在底部有下一步按钮.

由于不同的界面上半部分是相同的第二个界面只多出了下面几天条目,我为了兼容以后的开发,最初的设计是采用viewpager+fragmeng的形式.展现,不过后来遇到的情况是由于在不同的界面有不同的处理方式要保存各自的条目信息,这个就有了许多activity个Frgment数据交互的动作.比如,我点击保存时需要将Frgment界面中的元素对象发给activity在保存到服务器上,而两个Frgmeng只会保存其中的一种情况.so数据交互出现了大问题.这个问题虽然解决了不过后来还是舍弃了这种布局.不过以后会有机会用到这种布局的所以在这里保留一份笔记.
PS:代码中我使用了androidannotations注解.下面的解释只是我的Dome.不是App上的原始代码.
PSPS:有些人反对注解,其实我就是个菜鸟,对这个我没有太多的个人理解.
布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F5F5F5"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">

<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="0,1">

<TableRow>

<Button
android:id="@+id/fragmeng1_bt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Fragmeng 1" />

<Button
android:id="@+id/fragmeng2_bt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Fragmeng 2" />
</TableRow>

</TableLayout>

</LinearLayout>

<View
android:id="@+id/indicator_view"
android:layout_width="wrap_content"
android:layout_height="2dp"
android:background="@color/colorAccent" />
<dushiguang.myapplication.MyViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp">

</dushiguang.myapplication.MyViewPager>
</LinearLayout>

在MainActivity.java中:

@AfterViews
void afterViews(){
initViews();
setIndicatorWidth();
}
public void initViews() {
mAdapter = new ViewPageAdapter(getSupportFragmentManager());
mViewpager.setAdapter(mAdapter);
mViewpager.setCurrentItem(0);

mViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{}

@Override
public void onPageSelected(int position) {
if (position == 1) {
getTranslationPosition();
AnimatorUtil.StartXTranslation
(mIndicatorView, fTranslationBegin, ftranslationEnd, 300, null);
} else if (position == 0) {
getTranslationPosition();
AnimatorUtil.StartXTranslation(
mIndicatorView, ftranslationEnd, fTranslationBegin, 300, null);
}
}

@Override
public void onPageScrollStateChanged(int state) {}
});
}

这个setIndicatorWidth方法是设置指示位置,是两个button下面的一个红颜色的短杠.

private void setIndicatorWidth(){
WindowManager wm = MainActivity.this.getWindowManager();
int width = wm.getDefaultDisplay().getWidth();
LinearLayout.LayoutParams linearParams =new LinearLayout.LayoutParams(width/2,4);
mIndicatorView.setLayoutParams(linearParams);
}

这个两行代码
getTranslationPosition();
AnimatorUtil.StartXTranslation(mIndicatorView, fTranslationBegin, ftranslationEnd, 300, null);
就只是一个动画点击一个button短杠滑动到该button下面而已.
既然使用的是ViewPage,那自然需要Adapter了
ViewPageAdapter继承FragmentPagerAdapter

public class ViewPageAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragmentList;
private Fragment1_ mFragment1;
private Fragment2_ mFragment2;
public ViewPageAdapter(FragmentManager fm) {
super(fm);
fragmentList= new ArrayList<Fragment>();
mFragment1= new Fragment1_();
fragmentList.add(mFragment1);
mFragment2= new Fragment2_();
fragmentList.add(mFragment2);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}

这个个人感觉没有神马可以说的有多深fragment自己在ArrayList中Add就行.
Fragment1,Fragment2,这两个frgment就不说了,业务逻辑大多数在这里实现和操作.”Fragment1_”多了个下划线,没错你每天看错,我知道如果你看到了这里,你应该和我是一个级别的菜鸟(大师估计看了前面的就不会在往下看了).这个androidannotations注解的使用方式.

public class AnimatorUtil {
/** * 平移动画 */
public static void StartXTranslation(View view,float begin,float end,
int durtion,AnimatorListenerAdapter listener){
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", begin, end);
animator.setDuration(durtion);
if(listener!=null){
animator.addListener(listener);
}
animator.start();
}
}

在开发过程中遇到了一个问题是,当填写的信息格式不正确的时候会给与提示,而这个提示产品设计的是不是Dialog,我也说不上来是什么东东.我这里开发完了后发现当有不正确的提示信息了而viewpager还可以继续滑动(应该不能滑动),所有就应该在有提示信息时让viewpager不能左右滑动.so只好自定义一个viewpager.复写onTouchEvent和onInterceptTouchEvent方法(感谢网友)

public class MyViewPager extends ViewPager {

private boolean noScroll = false;
private Context context;

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

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

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (noScroll) {
return false;
} else {
return super.onTouchEvent(ev);
}
}

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (noScroll) {
return false;//false 不能左右滑动
} else {
return super.onInterceptTouchEvent(arg0);
}
}

public void setNoScroll(boolean noScroll) {
this.noScroll = scrollble;
}
}

当有提示信息是调用setNoScroll设置不能左右滑动.
基本上就是这些代码.对于其中的数据交互的部分我没有贴出代码注意是太麻烦了代码太多了.另外这些都是依据自己的业务来传的也许不太适合其他人.

这个就这些了,下次简单介绍一下自定义Dialog,这些Dialog布局中包含了seekBar,editext,checkbox控件.数据还有在主activity中得到和处理.

本来想把自定义Dialog来介绍一下,不过发现代码中没有什么可讲的,索性附上源码.
https://github.com/SunnyTime/ViewPageTest/tree/master
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android