我写这一系列也是为了我对代码的优化,以及为了快速开发做准备,自己积累点大多数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();