【笔记——Android】左右滑动ViewPage

制作可以左右移动的视图
大概的原理是Fragment + ViewPage,向ViewPage中添加Fragment
1、自定义一个Framgent 类:
public class TabFragment extends Fragment{

}

2、重写父类的onCreateView:
@Override
public void onCreateView(){

}
这里可以把传到该Fragment中的数据进行处理,比如绑定到控件中

3、在主Activity中,也就是计划使用ViewPage页面的对应类中进行设置。
首先让该类继承FragmentActivity
public class MainActivity extends FramgentActivity{

}

4、创建所需要的TabFragment对象,一个Fragment代表一个页面,然后存入List<Framgent> 集合中

5、配置FragmentPageAdapter对象,该对象用于控制ViewPage,创建FragmentPageAdapter对象,重写里面的getItem()和getCount()方法,构造时传入getSupportFragmentManager():

FragmentPageAdapter mAdapter = new FragmentPageAdapter(getSupportFragmentManager());

getItem():Return the Fragment associated with a specified position. 返回与指定位置相关的Fragment;
当滑动ViewPage的时候会产生一个position,也就是页面的编号,那么这个编号指代的是哪一个Fragment呢?所以调用Fragment List集合的get()方法,把应该显示的Fragment告诉系统
@Override
public void getItem(int position){

return mTabs.get(position);

}

getCount():大概的意思是用来告诉系统有多少个Fragment
@Override
getCount(int count){
return mTabls.size();
}

6、配置好FragmentPageAdapter后,就设置ViewPage的setAdapter(),使其使用该适配器:viewPage.setAdapter(mAdapter);

7、完整代码:

Main_Activity.java

  1 public class MainActivity extends FragmentActivity {
  2
  3     //用于显示可左右滑动的Fragment
  4     private ViewPager mViewPage;
  5     //用于存放所有会用到的Fragment
  6     private List<Fragment> mTabs = new ArrayList<>();
  7
  8     //测试用的字符
  9     private String[] mTitles = new String[]{
 10       "First Fragment!" ,"Second Fragment!","Third Fragment!","Forth Fragment!"
 11     };
 12
 13     //ViewPage的适配器,与显示Fragment有关
 14     private FragmentPagerAdapter mAdapter;
 15
 16     @Override
 17     protected void onCreate(Bundle savedInstanceState) {
 18         super.onCreate(savedInstanceState);
 19         setContentView(R.layout.activity_main);
 20
 21         //设置自定义图标
 22         setOverflowButtonAlways();
 23
 24         //影藏现有的头顶图标
 25         //getActionBar().setDisplayShowHomeEnabled(false);
 26
 27         initView();
 28
 29         initDatas();
 30
 31         //设置适配器
 32         mViewPage.setAdapter(mAdapter);
 33     }
 34
 35     private void initDatas(){
 36
 37     }
 38
 39     /**
 40      * 初始化视图方法
 41      */
 42     private void initView(){
 43         //获取mViewPage对象
 44         mViewPage = (ViewPager)findViewById(R.id.id_view_page);
 45
 46         //创建所需要的Fragment对象,并存入List mTabs集合里
 47         for(String title:mTitles){
 48             //这是自己定义的TabFragment
 49             TabFragment tabFragment = new TabFragment();
 50             Bundle bundle = new Bundle();
 51             bundle.putString(TabFragment.TITLE,title);
 52             //给tabFragment赋值
 53             tabFragment.setArguments(bundle);
 54             //把创建好的tabFragment放到mTabs List数组对象里面去
 55             mTabs.add(tabFragment);
 56         }
 57
 58         //设置ViewPage的适配器
 59         mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
 60             @Override
 61             public android.support.v4.app.Fragment getItem(int position) {
 62                 return mTabs.get(position);
 63             }
 64
 65             @Override
 66             public int getCount() {
 67                 return mTabs.size();
 68             }
 69         };
 70     }
 71
 72     private void setOverflowButtonAlways(){
 73         try {
 74             //获取该窗体的配置
 75             ViewConfiguration config = ViewConfiguration.get(this);
 76             //获取该类的sHasPermanentMenuKey属性
 77             Field menuKey = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
 78             //因为该属性是private的,所以需要调用这个方法来获得访问权
 79             menuKey.setAccessible(true);
 80             //设置该属性的值为false
 81             menuKey.setBoolean(config, false);
 82
 83         }catch (NoSuchFieldException | IllegalAccessException e) {
 84             e.printStackTrace();
 85         }
 86     }
 87
 88     @Override
 89     public boolean onMenuOpened(int featureId, Menu menu) {
 90
 91         if(featureId == Window.FEATURE_ACTION_BAR && menu != null){
 92             if(menu.getClass().getSimpleName().equals("MenuBuilder")) {
 93                 /*这里之所以使用反射而不直接使用对象调用setOptionalIconVisible,是因为该方法不是public方法
 94                  *这里的大概意思是要调用生成菜单的MenuBuilder方法的setOptionalIconVisible方法来使得菜单中设置的图标可见。
 95                  */
 96                 try {
 97                     /*getDeclaredMethod()方法可以获取该类的所有方法,包括public、private、protected、默认。但是getMethods()方法只能获取public方法
 98                     第二个参数是该方法的参数类型,从而从重写中区分所需方法是哪一个
 99                      */
100                     Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
101                     //由于setOptionalIconVisible不是public方法,所以调用之前需设置该方法为true
102                     m.setAccessible(true);
103                     //执行menu对象的setOptionalIconVisible();
104                     m.invoke(menu, true);
105                 }catch(Exception e){
106
107                 }
108             }
109         }
110
111         return super.onMenuOpened(featureId, menu);
112     }
113
114     @Override
115     public boolean onCreateOptionsMenu(Menu menu) {
116         // Inflate the menu; this adds items to the action bar if it is present.
117         getMenuInflater().inflate(R.menu.menu_main, menu);
118         return true;
119     }
120
121     @Override
122     public boolean onOptionsItemSelected(MenuItem item) {
123
124
125         return super.onOptionsItemSelected(item);
126     }
127 }

TabFragment.java

 1 public class TabFragment extends Fragment {
 2
 3     private String mTitle = "Default";
 4
 5     public static String TITLE = "title";
 6
 7     private static float TEXT_SIZE = 30;
 8
 9     @Override
10     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
11
12         /*获取Argument中的数据,该数据在MainAction中的initView()方法中通过调用setArgument()方法得到。
13         因为存进去的时候是通过Bundle对象,该对象是一个键值对对象,所以可以通过getString(String key)来获得值
14         即可以得到与title值相对应的value。
15          */
16         if(getArguments()!=null){
17             mTitle = getArguments().getString(TITLE);
18         }
19
20         //设置一个TextView,因为他是返回TextView的,所以这个TextView填充了整个Fragment
21         TextView tv = new TextView(getActivity());
22         tv.setTextSize(TEXT_SIZE);
23         tv.setBackgroundColor(Color.parseColor("#ffffffff"));
24         tv.setText(mTitle);
25         tv.setGravity(Gravity.CENTER);
26         return tv;
27     }
28 }
时间: 2024-08-03 02:51:28

【笔记——Android】左右滑动ViewPage的相关文章

Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式.当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一大批的朋友都来问我要这份双向滑动菜单的代码.由于这份代码写得很不用心,我发了部分朋友之后实在不忍心继续发下去了,于是决定专门写一篇文章来介绍更好的Android双向滑

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

如果写一个android桌面滑动切换屏幕的控件(三)

下面我们把这个控件内嵌到Layout中做一些动画和展示,效果图: 这个子控件可以上下移动,可以左右滑动,如果上下滑动距离大于左右滑动距离,则必须上下滑动 这样来写onTouch事件: @Override public boolean onTouchEvent(MotionEvent ev) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMov

Android左右滑动滚屏的实现

现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于前段时间项目的需要,所以也对其研究了一下,总的来说滑屏实现有三种方式:(至于其他的实现方式目前后还没碰到...) 1.ViewPager 2.ViewFlipper 3.ViewFlow   一.ViewPager 官方文档介绍:http://developer.android.com/reference/android/support/v4/

[笔记]Android开发环境配置及HelloWorld程序

Android的开发需要以下四个工具: 1.JDK 2.Eclipse 3.Android SDK 4.ADT 具体功能: 1.JDK.JDK即Java Development Kit(Java开发工具包),包括JAVA运行环境,基础类库和JAVA工具,是JAVA运行的基础. 2.Eclipse.Eclipse是开发JAVA程序的软件工具. 3.Android SDK.SDK即Software Development Kit(软件开发工具包).AndroidSDK指的是Android专属的软件开

【转】Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式.当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一大批的朋友都来问我要这份双向滑动菜单的代码.由于这份代码写得很不用心,我发了部分朋友之后实在不忍心继续发下去了,于是决定专门写一篇文章来介绍更好的Android双向滑

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

浅析:Android 嵌套滑动机制(NestedScrolling)

谷歌在发布安卓 Lollipop版本之后,为了更好的用户体验,Google为Android的滑动机制提供了NestedScrolling特性 NestedScrolling的特性可以体现在哪里呢? 比如你使用了Toolbar,下面一个ScrollView,向上滚动隐藏Toolbar,向下滚动显示Toolbar,这里在逻辑上就是一个NestedScrolling —— 因为你在滚动整个Toolbar在内的View的过程中,又嵌套滚动了里面的ScrollView. 在这之前,我们知道Android对