zoukankan      html  css  js  c++  java
  • 通过SlidingMenu+Fragment实现当前最流行的侧滑

    slidingmenu_fragment
    内容简介:

    通过SlidingMenu库与Fragment来实现当前最为流行的侧滑模式。其实涉及到的知识点有:

    1.SlidingMenu
    2.Fragment

    通过layout构建一个Fragment
    通过preference 来构建Fragment

     
    准备工作:

    1. SlidingMenu 下载地址: https://github.com/jfeinstein10/SlidingMenu
    2.下载好后,导入到我们eclipse(也可以新建一个项目,将SlidingMenu项目拷进去)
    3. 需要将SlidingMenu设置成is libray.因为我们需要在我们的demo中导入SlidingMenu。

    当然,以上步骤,如果你下载了我的源码,你可以不用做啦。呵呵

    接下来就是建立我们自己的demo项目啦。
    (新建项目过程省略200字,如果你下载了我的源码,你只需要需要入项目即可)

    首先我们需要准备两个界面的布局,一个是SlidingMenu的布局,也就是我们侧边栏的。另外一个为我们右边正文的显示布局。
    在这里需要说明一下的是, 这两个布局为Activity布局(我们可以理解成为框架的布局文件),而我们真正的Sliding和右边正文显示的内容是由Fragment提供的,那时 Fragment也有自己的布局文件,在 Fragment显示在Activity中时,会将自己的Fragment布局嵌入到Activity布局中。
    对于Fragment 的内容,大家自行学习一下就行了,特别是他的生命周期千万别与Activity混淆。

    frame_menu.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/menu"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent" />

    frame_content.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/content"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent" />

    Activity布局文件准备好了后,我们需要新建一个 Activity来继承SlidingActivity,则这个activity将会提供一个 sliding 菜单 ,和正文的显示 。

    MainActivity.java

    1. public class MainActivity extends SlidingActivity {
    2.  
    3. @Override
    4. public void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. setTitle("SlidingMenu Demo");
    7. setContentView(R.layout.frame_content);
    8. // set the Behind View
    9. setBehindContentView(R.layout.frame_menu);
    10. FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    11. MenuFragment menuFragment = new MenuFragment();
    12. fragmentTransaction.replace(R.id.menu, menuFragment);
    13. fragmentTransaction.replace(R.id.content, new ContentFragment("Welcome"));
    14. fragmentTransaction.commit();
    15.  
    16. // customize the SlidingMenu
    17. SlidingMenu sm = getSlidingMenu();
    18. sm.setShadowWidth(50);
    19. sm.setShadowDrawable(R.drawable.shadow);
    20. sm.setBehindOffset(60);
    21. sm.setFadeDegree(0.35f);
    22. //设置slding menu的几种手势模式
    23. //TOUCHMODE_FULLSCREEN 全屏模式,在content页面中,滑动,可以打开sliding menu
    24. //TOUCHMODE_MARGIN 边缘模式,在content页面中,如果想打开slding ,你需要在屏幕边缘滑动才可以打开slding menu
    25. //TOUCHMODE_NONE 自然是不能通过手势打开啦
    26. sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    27.  
    28. //使用左上方icon可点,这样在onOptionsItemSelected里面才可以监听到R.id.home
    29. getActionBar().setDisplayHomeAsUpEnabled(true);
    30. }
    31.  
    32. @Override
    33. public boolean onCreateOptionsMenu(Menu menu) {
    34. // Inflate the menu; this adds items to the action bar if it is present.
    35. getMenuInflater().inflate(R.menu.activity_main, menu);
    36. return true;
    37. }
    38. @Override
    39. public boolean onOptionsItemSelected(MenuItem item) {
    40. switch (item.getItemId()) {
    41. case android.R.id.home:
    42. //toggle就是程序自动判断是打开还是关闭
    43. toggle();
    44. // getSlidingMenu().showMenu();// show menu
    45. // getSlidingMenu().showContent();//show content
    46. return true;
    47. }
    48. return super.onOptionsItemSelected(item);
    49. }
    50. }

    解释:
    代码中有详细的解释,就不再多说了。下面有几个需要注意的地方:

    1.setContentView() 设置我们正文的显示布局,这和我们正常的Activity是一样的。
    2.setBehindContentView() 设置SlidingMeni的布局。
    3.FragmentTransaction类主要用于管理Fragment,有添加,替换,删除等操作。尤其是beginTransaction()与commit()方法与SQL中的事务有点类似。相信大家理解不难。如果需要更多详细信息,自行搜索。
    4.SlidingMenu 可以设置Sliding的一些属性,像shadowwidth , shadowDrable等等根据英语解释大家都应该知道用处。可以自行设置看看效果。
    5.SlidingMenu.setTouchModeAbove().其中一共包含三中手势模式:

    TOUCHMODE_FULLSCREEN 全屏模式,在正文布局中通过手势也可以打开SlidingMenu
    TOUCHMODE_MARGIN 边缘模式,在正文布局的边缘处通过手势可以找开SlidingMenu
    TOUCHMODE_NONE 自然是不能通过手势打开SlidingMenu了

    6.toggle() 是SldingMenu自动判断当前是打开还是关闭。
    7.需要注意的是继承了SlidingActivity后,需要把oncreate修改成public
    8.setBehindOffset()为设置SlidingMenu打开后,右边留下的宽度。大家可以把这个值写在dimens里面去:

    这样就可以带上dp单位,可以适应多分辨率了。不然有些手机上面右边留出的多,有的少。

    注意:SlidingMenu非常的强大 ,可以为左右同时设置SlidingMenu,也可以设置打开Menu时的动画 。具体可以参与SlidingMenu 的源码。我们要信息,在源码面前没有秘密 。

    在MainActivity中,我们看到了我们的正文是由ContentFragment来填充内容的。SlidingMenu是由MenuFragment来填充内容的。
    在这里需要说明一下的是,在ContentFragment中我们是通过一般的layout文件来构成的Fragment .
    MenuFragment是由prefrence Fragment来完成我们的菜单内容的。

    关于这两个Fragment的布局文件也直接跳过了,帖出来也是占用我们宝贵的网络资源。我们先来看看MenuFragment代码 :

    MenuFragment.java

    1. public class MenuFragment extends PreferenceFragment implements OnPreferenceClickListener{
    2. int index = -1;
    3. @Override
    4. public void onCreate(Bundle savedInstanceState) {
    5. // TODO Auto-generated method stub
    6. super.onCreate(savedInstanceState);
    7. //set the preference xml to the content view
    8. addPreferencesFromResource(R.xml.menu);
    9. //add listener
    10. findPreference("a").setOnPreferenceClickListener(this);
    11. findPreference("b").setOnPreferenceClickListener(this);
    12. findPreference("n").setOnPreferenceClickListener(this);
    13. }
    14.  
    15. @Override
    16. public boolean onPreferenceClick(Preference preference) {
    17. String key = preference.getKey();
    18. if("a".equals(key)) {
    19. //if the content view is that we need to show . show directly
    20. if(index == 0) {
    21. ((MainActivity)getActivity()).getSlidingMenu().toggle();
    22. return true;
    23. }
    24. //otherwise , replace the content view via a new Content fragment
    25. index = 0;
    26. FragmentManager fragmentManager = ((MainActivity)getActivity()).getFragmentManager();
    27. fragmentManager.beginTransaction()
    28. .replace(R.id.content, new ContentFragment("This is A Menu"))
    29. .commit();
    30. }else if("b".equals(key)) {
    31. if(index == 1) {
    32. ((MainActivity)getActivity()).getSlidingMenu().toggle();
    33. return true;
    34. }
    35. index = 1;
    36. FragmentManager fragmentManager = ((MainActivity)getActivity()).getFragmentManager();
    37. fragmentManager.beginTransaction()
    38. .replace(R.id.content, new ContentFragment("This is B Menu"))
    39. .commit();
    40. }else if("n".equals(key)) {
    41.  
    42. if(index == 2) {
    43. ((MainActivity)getActivity()).getSlidingMenu().toggle();
    44. return true;
    45. }
    46. index = 2;
    47. FragmentManager fragmentManager = ((MainActivity)getActivity()).getFragmentManager();
    48. fragmentManager.beginTransaction()
    49. .replace(R.id.content, new ContentFragment("This is N Menu"))
    50. .commit();
    51. }
    52. //anyway , show the sliding menu
    53. ((MainActivity)getActivity()).getSlidingMenu().toggle();
    54. return false;
    55. }
    56. }

    代码解释:

    1.Fragment的生命周期参考下图:
    fregemt生命周期png
    2.onCreate中完成了Preference布局的添加与设置各个选项的监听
    3.在onPreferenceClick()方法中,我们先判断当前正文显示的是不是该选项的内容,如果是,则不用再去跳转了。如果不是,再从FragmentManager里面看能否找出已经存在的可用的fragment。如果没有,再创建新的fragment

    ContentFragment就比较简单了,我们主要是在onCreateView()方法中创建我们的view ,并返回就可以了
    ContentFragment.java

    1. public class ContentFragment extends Fragment {
    2. String text = null;
    3.  
    4. public ContentFragment() {
    5. }
    6.  
    7. public ContentFragment(String text) {
    8. Log.e("Krislq", text);
    9. this.text = text;
    10. }
    11.  
    12. @Override
    13. public void onCreate(Bundle savedInstanceState) {
    14. super.onCreate(savedInstanceState);
    15. setRetainInstance(true);
    16. Log.e("Krislq", "onCreate:"+text);
    17. }
    18.  
    19. @Override
    20. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    21. Log.e("Krislq", "onCreateView:"+ text);
    22. //inflater the layout
    23. View view = inflater.inflate(R.layout.fragment_text, null);
    24. TextView textView =(TextView)view.findViewById(R.id.textView);
    25. if(!TextUtils.isEmpty(text)) {
    26. textView.setText(text);
    27. }
    28. return view;
    29. }
    30. }

    好的,如果大家还有什么疑问,留言吧。
    源码来了。

    ===============
    SlidingMenu+Fragment
    ===============

    下期实例预告: SlidingMenu+ViewPager+fragment


    转自:http://www.krislq.com/2013/03/android_case_slidingmenu_fragment/

  • 相关阅读:
    HTML5新标签与特性---多媒体
    HTML5新标签与特性---新表单+新属性----综合案例1
    字体图标引入到HTML---复制用代码
    字体图标网站---常用汇总
    滑动门出现的背景---实例微信导航栏(a盒子里面包span盒子,文字写在span里)
    【Web前端开发】---前端培训roadmap
    清除浮动的4种方法
    进度更新---Responsive Web Design Certification (300 hours)
    Python实现一个桌面版的翻译工具【新手必学】
    Python爬虫老是被封的解决方法【面试必问】
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787317.html
Copyright © 2011-2022 走看看