PS:努力的往前飞..再累也无所谓..

学习内容:

1.使用SlidingMenu实现滑动菜单..

  SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行其他的操作...

  SlidingMenu的实现有很多种方式..个人感觉最实用的方式还是使用继承SlidingFragment的方式来实现..这样我们可以添加更多的Fragment来展现一个视图..首先使用最简单的方式实现一个滑动后在左侧出现一个滑动视图...

1.使用最基本的方式实现SlidingMenu

  通过使用创建SlidingMenu对象..然后对其进行相关参数的设置..将这个滑动菜单再添加到相关联的Activity当中就可以完成一个滑动菜单的创建了...

package com.darker;

import android.app.Activity;
import android.os.Bundle; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); SlidingMenu menu = new SlidingMenu(this); //创建一个滑动菜单对象..
menu.setMode(SlidingMenu.LEFT);
// 设置触摸屏幕的模式
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setShadowWidthRes(R.dimen.shadow_width);
menu.setShadowDrawable(R.drawable.shadow); // 设置滑动菜单视图的宽度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
// 设置渐入渐出效果的值
menu.setFadeDegree(0.35f);
// 把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT , SLIDING_WINDOW
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
// 为侧滑菜单设置布局
menu.setMenu(R.layout.leftmenu); } }

  这里是通过直接对对象进行创建,然后设置相关的属性..从而构造一个滑动菜单..我们同样可以在布局文件当中去写一个SlidingMenu..然后通过获取ID的方式去指定样式..同样可以创建一个滑动菜单...布局的方式采用这种方式..那么这块的布局就会去调用com.jeremyfeinstein.slidingmenu.lib.SlidingMenu去创建一个SlidingMenu..

 <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
xmlns:sliding="http://schemas.android.com/apk/res-auto"
android:id="@+id/slidingmenulayout"
android:layout_width="120dp"
android:layout_height="170dp"
android:background="#ffffffff"
sliding:behindOffset="0dp"
sliding:behindScrollScale="1"
sliding:fadeDegree="0.3"
sliding:fadeEnabled="true"
sliding:touchModeAbove="fullscreen"
sliding:viewAbove="@layout/pic">
</com.jeremyfeinstein.slidingmenu.lib.SlidingMenu>

  这样创建出来的SlidingMenu会按照xml指定的大小和位置出现..动态布局其实和这样的静态布局其实区别并不是非常的大...动态则需要我们手动去创建..通过建立对象的方式..而静态则是调用xml文件的方式..最后归根结底都去调用SlidingMenu的构造函数去创建一个滑动菜单...

package com.Darker;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; public class MainActivity extends Activity {
private SlidingMenu mLeftMenu; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mLeftMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout);
// configure the SlidingMenu
// SlidingMenu menu = new SlidingMenu(this);
mLeftMenu.setMode(SlidingMenu.LEFT);
// 设置触摸屏幕的模式
mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);
mLeftMenu.setShadowDrawable(R.drawable.shadow); mLeftMenu.setMenu(R.layout.leftmenu); mLeftMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mLeftMenu.isMenuShowing())
mLeftMenu.toggle();
}
});
} }

2.使用另外一种方式去创建一个SlidingMenu...

  第二种方式则是采用 extends SlidingFragmentActivity的方式去实现一个滑动菜单..它extends FragmentActivity..说到这里就不得不说一下Fragment了..这个在Android 3.0 就被正式引入的新概念..但是在Android 4.0才开始正式启用..

  Fragment被称为碎片管理,这个名字给我感觉和它的作用到底有毛关系我还真就不是非常的清楚..还是说一下它的具体功能吧..Fragment其实是一个轻量级的Acticity..因为app都是采用多Activity进行管理的..因此当界面众多的时候..我们需要建立多个Activity..Activity通过Intent去完成数据信息的传递和交互过程..但是多个Activity就会导致一个问题的出现..在对应用软件进行相关维护的时候,由于Activity众多..导致可维护性也比较差..众多的Activity会导致AndroidManifest配置文件非常的难读..因此这里就引入了Fragment这个概念.并且它内部封装的方法可以直接拿到inflater..这样我们可以直接去inflate布局..

  Fragment的使用可以定义在xml布局文件当中..

    <fragment
android:id="@+id/fragment"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>

  以这样的方式在xml文件内部定义fragment,然后在主函数内部通过获取ID的方式,然后对fragment进行设置也是可以的..不过我个人感觉..fragment通过动态的创建更加的好用..一个简单的fragment的定义方式..

package com.Darker;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class MainTab01 extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.main_tab_01, container, false);
}
}

  这样直接创建一个Fragment子类..通过继承的方式..这样就能够继承内部的大部分属性..onCreateView这个方法是个非常常用的方法..其实就是拿到当前Activity的inflater然后直接在View上加载一个新的布局..这样就可以直接在Activity添加fragment...多说无益..来一段代码...

package com.Darker;

import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.Window; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; public class MainActivity extends SlidingFragmentActivity { private ViewPager mViewPager; //ViewPager用于保存多个View..以多页的方式进行保存..
private FragmentPagerAdapter mAdapter; //Fragment适配器..
private List<Fragment> mFragments = new ArrayList<Fragment>(); //定义一个List..用来保存Fragment.. @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 初始化SlideMenu
initRightMenu();
// 初始化ViewPager
initViewPager(); } private void initViewPager() {
mViewPager = (ViewPager) findViewById(R.id.id_viewpager); //获取ViewPager.. /**
* 自定义了三个轻量级Activity..也就是Fragment..
* */ MainTab01 tab01 = new MainTab01();
MainTab02 tab02 = new MainTab02();
MainTab03 tab03 = new MainTab03(); //将三个Fragment保存在List中..
mFragments.add(tab01);
mFragments.add(tab02);
mFragments.add(tab03);
/**
* 初始化Adapter..
*/
mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return mFragments.size(); //返回Fragment的数量..
} @Override
public Fragment getItem(int arg0) {
return mFragments.get(arg0); //获取Fragment子选项..
}
};
mViewPager.setAdapter(mAdapter);
} //这里自定义了两个滑动菜单...
private void initRightMenu() { Fragment leftMenuFragment = new MenuLeftFragment(); // 左侧的视图View..
setBehindContentView(R.layout.left_menu_frame); //设置需要被覆盖的布局.. /**
* 首先获取碎片管理权限..
* 由于布局之间的覆盖是一个事务.因此需要将事物设置为开始状态..
* 同时调用replace方法来设置布局之间的相互替代...
* 最后将事物进行提交..
* */
getSupportFragmentManager().beginTransaction()
.replace(R.id.id_left_menu_frame, leftMenuFragment).commit();
SlidingMenu menu = getSlidingMenu(); //定义一个滑动菜单..
menu.setMode(SlidingMenu.LEFT_RIGHT);
// 设置触摸屏幕的模式
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
menu.setShadowWidthRes(R.dimen.shadow_width);
menu.setShadowDrawable(R.drawable.shadow);
// 设置滑动菜单视图的宽度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
// 设置渐入渐出效果的值
menu.setFadeDegree(0.35f);
menu.setSecondaryShadowDrawable(R.drawable.shadow); // 设置了一个(二级)侧滑菜单
menu.setSecondaryMenu(R.layout.right_menu_frame);
Fragment rightMenuFragment = new MenuRightFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.id_right_menu_frame, rightMenuFragment).commit();
} //显示当前滑动菜单的左侧子菜单..
public void showLeftMenu(View view) {
getSlidingMenu().showMenu();
} //显示当前滑动菜单的右侧子菜单..
public void showRightMenu(View view) {
getSlidingMenu().showSecondaryMenu();
}
}

  这里我们可以看到通过extends SlidingFragmentActivity 来实现的..并且这里使用了一个ViewPager..用来保存多个界面.从而实现滑动..并且在这里定义了两个滑动菜单..这两个滑动菜单通过人为在屏幕的最左右侧进行滑动来完成触发..通过滑动..那么滑动的子菜单也会得到展示..我们同样可以操作子菜单来完成更多的操作..这里并不是因为继承了当前Activity继承了SlidingFragmentActivity才实现的左右菜单一起进行设置..通过继承普通的Activity也是能够实现的...这里不要走入误区..

  继承了SlidingFragmentActivity的原因是我希望当前的主Activity能够添加fragment的形式来完成滑动...

  还需要说的一点就是ViewPager也是需要设置适配器的..这里使用了Android系统自带的FragmentPageAdapter..其实也是通过继承了PagerAdapter来实现的..我们只需要重写一个抽象方法就可以了..总之实现的过程是非常的简单的...

  最后附加上一个源码提供个大家:http://files.cnblogs.com/files/RGogoing/zhy_slidingmenu_demo.rar (源代码不是本人写的..这个源代码主要是针对如何使用SlidingMenu..)

  

Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现的更多相关文章

  1. Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  2. Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

    PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...

  3. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  4. Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  5. Android 学习笔记之AndBase框架学习(一) 实现多功能标题栏

    PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBas ...

  6. Android 学习笔记之AndBase框架学习(四) 使用封装好的函数实现单,多线程任务

    PS:Force Is Meaningless Without Skill 学习内容: 1.使用AndBase实现单线程任务... 2.使用AndBase实现多线程任务...   AndBase内部封 ...

  7. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  8. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是 ...

  9. Hadoop学习笔记—15.HBase框架学习(基础实践篇)

    一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先 ...

随机推荐

  1. 使用Enitity Framework实现增删改查服务中的一些通用思路

    添加 → 方法参数中有一个有关添加视图模型类型的形参,比如vm→ 根据vm的某个属性,比如Name判断在上下文中是否存在,如果不存在就抛EntityNotFoundException异常→ 判断vm所 ...

  2. Android带多选功能的PhotoPicker

    最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一 ...

  3. 构造函数模式自己定义js对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 针对不同的Cookie做页面缓存

    有时我们需要为PC浏览器及移动浏览器生成不同的页面,为了提高性能,不能每次请求都去判断User-Agent,通常用一个 Cookie 标记一下客户端是否是移动客户端,这样只需要读取这个 Cookie ...

  5. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  6. c++中typename和class的区别介绍

    "typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称( ...

  7. 【LeetCode】273. Integer to English Words

    Integer to English Words Convert a non-negative integer to its english words representation. Given i ...

  8. Asp.net Core中使用Entity Framework Core CodeFirst

    1.安装对应的包 "Microsoft.EntityFrameworkCore.Design": "1.1.0", "Microsoft.Entity ...

  9. [GraphQL] Use GraphQLNonNull for Required Fields

    While certain fields in a GraphQL Schema can be optional, there are some fields or arguments that ar ...

  10. Nginx upstream 长连接

    原文: http://bollaxu.iteye.com/blog/900424 Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connecti ...