码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-01-22 17:05:40      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

制作可以左右移动的视图
大概的原理是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 }

 

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

标签:

原文地址:http://www.cnblogs.com/kirno/p/4241825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!