标签:
制作可以左右移动的视图
大概的原理是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 }
标签:
原文地址:http://www.cnblogs.com/kirno/p/4241825.html