我写这一系列也是为了我对代码的优化,以及为了快速开发做准备,自己积累点大多数APP的框架------------
第一篇我讲以slidingmenu+Fragment开始
根据谷歌官方显示tabhost tabactivity不建议使用了,因为前2者都需要创建activity,太消耗资源了,所以tab页我将以RadioGroup来显示组件
回到这片文章的开始,因为我们需要slidingmenu 和Fragment 来创建APP 所以我们的Mainactivity需要继承SlidingFragmentActivity,同时导入slidingmenu的架包 记住覆盖V4架包,同时Fragment需要引入 v4架包 对下兼容。
同时,要创建一个HomeFragment替换主布局,和MenuFragment去替换菜单布局
对于slidingmenu 的使用
第一 导入架包
第二 继承slidingmenu
第三 使用slidingmenu
1 得到滑动菜单
2 设置滑动菜单是在左边出来还是右边出来
3 设置滑动菜单出来之后,内容页,显示的剩余宽度
4 设置滑动菜单的阴影 设置阴影,阴影需要在开始的时候,特别暗,慢慢的变淡
5 设置阴影的宽度
6 设置滑动菜单的范围
小新思路:要想使用slidingmenu(工具),你就必须去拿到使用权(架包),然后再用的时候把工具拿出来(继承他),然后拿到工具(slidingmenu)开始使用。
对于Fragment 第一点很重要就是生命周期,有时候生命周期,能帮助我们完成很多事情,同时我在前面说了有些东西被谷歌官方不建议使用,就因为他的出现,为了APP的效率我们也只有用他了,Fragment 跟Activity的区别在于,不需要重新创建activity也有会有他的效果,对于一个App是很好的事情,开始使用他的时候,大家都有陌生
他也有很多方法
首先是:getactivity() 能得到当前适用对象的activity
package com.xiaoxin.NewS; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; import com.xiaoxin.NewS.Fragment.HomeFragment; import com.xiaoxin.NewS.Fragment.MenuFragment; import android.app.Activity; import android.app.ActionBar; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.os.Build; public class MainActivity extends SlidingFragmentActivity { private SlidingMenu sm; /** * 1 得到滑动菜单 2 设置滑动菜单是在左边出来还是右边出来 3 设置滑动菜单出来之后,内容页,显示的剩余宽度 4 设置滑动菜单的阴影 * 设置阴影,阴影需要在开始的时候,特别暗,慢慢的变淡 5 设置阴影的宽度 6 设置滑动菜单的范围 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //设置菜单布局 setBehindContentView(R.layout.menu); setContentView(R.layout.content); // 设置滑动菜单的布局 sm = getSlidingMenu(); // 2 设置滑动菜单是在左边出来还是右边出来 // 参数可以设置左边LEFT,也可以设置右边RIGHT ,还能设置左右LEFT_RIGHT sm.setMode(SlidingMenu.LEFT); // 3 设置滑动菜单出来之后,内容页,显示的剩余宽度 sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); // 4 设置滑动菜单的阴影 设置阴影,阴影需要在开始的时候,特别暗,慢慢的变淡 sm.setShadowDrawable(R.drawable.shadow); // 5 设置阴影的宽度 sm.setShadowWidth(R.dimen.shadow_width); // 6 设置滑动菜单的范围 // 第一个参数 SlidingMenu.TOUCHMODE_FULLSCREEN 可以全屏滑动 // 第二个参数 SlidingMenu.TOUCHMODE_MARGIN 只能在边沿滑动 // 第三个参数 SlidingMenu.TOUCHMODE_NONE 不能滑动 sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); // 创建fragment,获取到使用权 MenuFragment menuFragment = new MenuFragment(); // 获取fragment的管理者 getSupportFragmentManager() // 开启事物 .beginTransaction() // 替换 .replace(R.id.menu_frame, menuFragment, "Menu") // 提交 .commit(); HomeFragment homeFragment = new HomeFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, homeFragment, "Home").commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } /** * 方法D 回调 */ public void switchFragment(Fragment f) { getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, f).commit(); // 自动切换 sm.toggle(); } }相信大家看到代码最后有一个方法时回调,其实用slidingmenu有个最难的地方就是点击slidingmenu的menu会切换界面,但是是在一个界面切换,使用Fragment去替换,相信大家看到了菜单上有5个Fragment 我们就先看到MenuFragment上的代码
首先我先说一个经常用的一个方法 填充器,专门填充各种各种布局,控件
LayoutInflater
package com.xiaoxin.NewS.Fragment; import java.util.ArrayList; import java.util.List; import com.xiaoxin.NewS.MainActivity; import com.xiaoxin.NewS.R; import com.xiaoxin.NewS.R.id; import com.xiaoxin.NewS.R.layout; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class MenuFragment extends Fragment implements OnItemClickListener { private View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //将ListView填充到Fragment 在这里要记住Fragment的生命周期 view=LayoutInflater.from(getActivity()).inflate(R.layout.list_view, null); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ListView listView=(ListView) view.findViewById(R.id.list_view); ArrayAdapter<String>adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,android.R.id.text1,initData()); listView.setAdapter(adapter); listView.setOnItemClickListener(this); } private List<String> initData() { List<String> list = new ArrayList<String>(); list.add("fragment1"); list.add("fragment2"); list.add("fragment3"); list.add("fragment4"); list.add("fragment5"); return list; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fragment f=null; switch (position) { case 0: f =new Fragment1(); break; case 1: f =new Fragment2(); break; case 2: f =new Fragment3(); break; case 3: f =new Fragment4(); break; case 4: f =new Fragment5(); break; } switchFragment(f); } private void switchFragment(Fragment f) { if(f!=null){ // Fragment中有一个getActivity()的方法。这个方法会返回当前Fragment所附加的Activity if(getActivity()instanceof MainActivity){ ((MainActivity)getActivity()).switchFragment(f); } } } }
大家也看的出 布局一个 ListView 它的出现就意味着要有一个适配器。相信大家都看的懂的。
当然这里是一个Fragment我就顺便说下他的生命周期 一般会用三个方法 顺序
onCreate onCreateView onActivityCreated 利用他的周期
我们可以 在onCreateView 的时候initview() onActivityCreated initdata() 大家记着 因为后面我会把Fragment的文件提取抽来 做一个BaseFragment 用来继承 为的就是少写几行代码
同时我也说下思路:因为布局使用ListView所以会有adapter适配器去添加所有的Fragment去显示 同时添加点击事件,去切换布局。
同时说下回调:
小新思路:因为slidingmenu的menu的点击 需要MainAcitivity去切换Fragment的 所以回调是最好的方法
回调的使用,也就是将一个类的引用放入另一个类 同时两个类形成 子类父类的关系 所以就有了 instanceof这个方法
我们再看看HomeFragmet的方法
package com.xiaoxin.NewS.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import com.xiaoxin.NewS.R; import com.xiaoxin.NewS.R.layout; public class HomeFragment extends BaseFragment{ @Override public View initView(LayoutInflater inflater) { View view = inflater.inflate(R.layout.frag_home2, null); return view; } @Override public void initData(Bundle savedInstanceState) { } }就如我在前面说说 我用了继承baseFragment 好啦 大家看看
package com.xiaoxin.NewS.Fragment; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * BaseFragment的存在 在于 让每一个Fragment少写几行代码 * @author Administrator * */ public abstract class BaseFragment extends Fragment { public View view; private Context ct; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ct = getActivity(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = initView(inflater); return view; } /** * 初始化view */ public abstract View initView(LayoutInflater inflater); public abstract void initData(Bundle savedInstanceState); }相信大家看得懂的
好了 回到主方法 大家可以看到 菜单 和HomeFragment替换的是哪个部分
MenuFragment menuFragment = new MenuFragment(); // 获取fragment的管理者 getSupportFragmentManager() // 开启事物 .beginTransaction() // 替换 .replace(R.id.menu_frame, menuFragment, "Menu") // 提交 .commit(); HomeFragment homeFragment = new HomeFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame, homeFragment, "Home").commit();