菜单栏与内容的交互涉及到通过MainActivity获取到相应的对象或者数据。
主要的逻辑如下MainActivity.java左边的菜单和右边模块的交互
package com.ldw.news;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Window;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
import com.ldw.news.fragment.ContentFragment;
import com.ldw.news.fragment.LeftMenuFragment;
/*
* 主界面
*/
public class MainActivity extends SlidingFragmentActivity {
private static final String FRAGMENT_LEFT_MENU = "fragment_left_menu";
private static final String FRAGMENT_CONTENT = "fragment_content";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
}
private void initView() {
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//设置左侧边栏
setBehindContentView(R.layout.left_menu);
//获取侧边栏对象
SlidingMenu slidingMenu = getSlidingMenu();
//设置全屏触摸
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
//设置预留屏幕的宽度
slidingMenu.setBehindOffset(200);
initFragment();
}
/*
* 初始化fragment,将fragment填充给布局文件
*/
private void initFragment() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();// 开启事务
//左侧边栏用布局替代(填充)
//第三个参数就是给fragment取一个名字,可以使用fm.findFragmentByTag(FRAGMENT_LEFT_MENU);
transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
FRAGMENT_LEFT_MENU);// 用fragment替换framelayout
//内容的填充
transaction.replace(R.id.fl_content, new ContentFragment(),
FRAGMENT_CONTENT);
transaction.commit();// 提交事务
//使用第三个参数
// Fragment leftMenuFragment = fm.findFragmentByTag(FRAGMENT_LEFT_MENU);
}
//获取到左侧边栏的对象,娶一个别名,通过MainActivity获取到右边的内容数据,来初始化左边的条目
public LeftMenuFragment getLeftMenuFragment(){
FragmentManager fm = getSupportFragmentManager();
LeftMenuFragment leftMenuFragment = (LeftMenuFragment) fm.findFragmentByTag(FRAGMENT_LEFT_MENU);
return leftMenuFragment;
}
//获取到左侧边栏对应的右边的详情,通过MainActivity初始化右边的内容详情
public ContentFragment getContentFragemnt(){
FragmentManager fm = getSupportFragmentManager();
ContentFragment contentFragment = (ContentFragment) fm.findFragmentByTag(FRAGMENT_CONTENT);
return contentFragment;
}
}
LeftMenuFragment.java左侧菜单栏的逻辑文件,初始化左侧的菜单栏,通过监听点击事件,来切换右边的内容
package com.ldw.news.fragment;
import java.util.ArrayList;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.ldw.news.MainActivity;
import com.ldw.news.R;
import com.ldw.news.base.impl.NewsCenterPager;
import com.ldw.news.domain.NewsData;
import com.ldw.news.domain.NewsData.NewsMenuData;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
/*
* 左侧边栏的内容
*/
public class LeftMenuFragment extends BaseFragment{
@ViewInject(R.id.lv_list)
private ListView lv_list;
private ArrayList<NewsMenuData> mMenuList;
private MenuAdapter mAdapter;
private int mCurrentPosition;//当前被点击的菜单栏目
//初始化布局
@Override
public View initViews() {
View view = View.inflate(mActivity, R.layout.fragment_left_menu, null);
ViewUtils.inject(this, view);
return view;
}
public void initData(){
lv_list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
mCurrentPosition = position;
//更新getItem获取的
mAdapter.notifyDataSetChanged();
//显示右边的详细内容
setCurrentMenuDetailPager(position);
// 点击以后隐藏左边的菜单栏
toggleSlidingMenu();
}
});
}
/*
* 切换SlidingMenu的状态
*/
protected void toggleSlidingMenu() {
//初始化MainActivity来获取到SlidingMenu
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
// 切换状态, 显示时隐藏, 隐藏时显示
slidingMenu.toggle();
}
/*
* 设置当前菜单详情页,设置右边对应的内容
* 通过获取到activity来间接的获取到ViewPager中的内容来初始化右边的内容
*/
protected void setCurrentMenuDetailPager(int position) {
//初始化MainActivity来获取到内容Fragment
MainActivity mainUi = (MainActivity) mActivity;
//获取到内容的fragment
ContentFragment fragment = mainUi.getContentFragemnt();
// 获取新闻中心页面
NewsCenterPager pager = (NewsCenterPager) fragment.getNewsCenterPager();
// 设置当前菜单详情页内容
pager.setCurrentMenuDetailPager(position);
}
//设置网络数据
public void setMenuData(NewsData data){
System.out.println("左侧的数据是:" + data);
mMenuList = data.data;
mAdapter = new MenuAdapter();
lv_list.setAdapter(mAdapter);
}
class MenuAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mMenuList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mMenuList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(mActivity, R.layout.list_menu_item, null);
TextView tv_title = (TextView)view.findViewById(R.id.tv_title);
//获取到对应位置的data4组中的数据
NewsMenuData newsMenuData = (NewsMenuData) getItem(position);
tv_title.setText(newsMenuData.title);
//判断点击的mCurrentPosition是不是tPosition一致,也就是被选中
if(mCurrentPosition == position){
// 显示红色,让listView的selector生效,state_enabled的时候是红色
tv_title.setEnabled(true);
} else {
// 显示白色
tv_title.setEnabled(false);
}
return view;
}
}
}
BasePager.java右边Pager的基类
package com.ldw.news.base;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.ldw.news.MainActivity;
import com.ldw.news.R;
/**
* 主页下5个子页面的基类
*
* @author Kevin
*
*/
public class BasePager {
public Activity mActivity;
public View mRootView;// 布局对象
public TextView tvTitle;// 标题对象
public FrameLayout flContent;// 内容
public ImageButton btnMenu;// 菜单按钮
public BasePager(Activity activity) {
mActivity = activity;
initViews();
}
/**
* 初始化布局
*/
public void initViews() {
mRootView = View.inflate(mActivity, R.layout.base_pager, null);
tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);
//点击的时候显示左边的菜单栏
btnMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleSlidingMenu();
}
});
}
/*
* 切换SlidingMenu的状态
*/
protected void toggleSlidingMenu() {
//初始化MainActivity来获取到SlidingMenu
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
// 切换状态, 显示时隐藏, 隐藏时显示
slidingMenu.toggle();
}
/**
* 初始化数据
*/
public void initData() {
}
/**
* 设置侧边栏开启或关闭,左侧边栏在MainActivity中
* MainActivity中有SlidingMenu
*/
public void setSlidingMenuEnable(boolean enable) {
//获取到MainActivity,这样可以操作slidingMenu
MainActivity mainUi = (MainActivity) mActivity;
//获取到slidingMenu对象
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
//设置slidingMenu是否可以点击
if (enable) {
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
} else {
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
}
右侧的内容ContentFragment.java
package com.ldw.news.fragment;
import java.util.ArrayList;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import com.ldw.news.R;
import com.ldw.news.base.BasePager;
import com.ldw.news.base.impl.GovAffairsPager;
import com.ldw.news.base.impl.HomePager;
import com.ldw.news.base.impl.NewsCenterPager;
import com.ldw.news.base.impl.SettingPager;
import com.ldw.news.base.impl.SmartServicePager;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
/*
* 主界面
*/
public class ContentFragment extends BaseFragment{
@ViewInject(R.id.rg_group)
private RadioGroup rg_group;
@ViewInject(R.id.vp_content)
private ViewPager mViewPager;
private ArrayList<BasePager> mPagerList;
//初始化布局
@Override
public View initViews() {
View view = View.inflate(mActivity, R.layout.fragment_content, null);
//获取的id注入view
ViewUtils.inject(this, view);
return view;
}
//初始化数据
@Override
public void initData(){
//默认勾选home
rg_group.check(R.id.rb_home);
mPagerList = new ArrayList<BasePager>();
//初始化5个页面
/*
for(int i = 0; i < 5; i++){
BasePager pager = new BasePager(mActivity);
mPagerList.add(pager);
}
*/
mPagerList.add(new HomePager(mActivity));
mPagerList.add(new NewsCenterPager(mActivity));
mPagerList.add(new SmartServicePager(mActivity));
mPagerList.add(new GovAffairsPager(mActivity));
mPagerList.add(new SettingPager(mActivity));
mViewPager.setAdapter(new ContentAdapter());
//监听rg_group的点击事件切换屏幕
rg_group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// 根据checkedId来判断显示哪一个
switch(checkedId){
case R.id.rb_home:
// mViewPager.setCurrentItem(0);// 设置当前页面
mViewPager.setCurrentItem(0, false);// false参数的作用是去掉切换页面的动画
break;
case R.id.rb_news:
mViewPager.setCurrentItem(1, false);// 设置当前页面
break;
case R.id.rb_smart:
mViewPager.setCurrentItem(2, false);// 设置当前页面
break;
case R.id.rb_gov:
mViewPager.setCurrentItem(3, false);// 设置当前页面
break;
case R.id.rb_setting:
mViewPager.setCurrentItem(4, false);// 设置当前页面
break;
default:
break;
}
}
});
//监听mViewPager对象,来切换动画,当前的ViewPager被选中以后,就初始化该页面的数据
mViewPager.setOnPageChangeListener(new OnPageChangeListener(){
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// 获取当前被选中的页面, 初始化该页面数据
mPagerList.get(position).initData();
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
});
// 初始化首页数据,因为页面点击的时候才会初始化数据,因此刚进入的时候,第一页没有初始化,需要手动初始化数据
mPagerList.get(0).initData();
}
class ContentAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return mPagerList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
// TODO Auto-generated method stub
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//获取到某个位置的pager
BasePager pager = mPagerList.get(position);
//填充布局对象
container.addView(pager.mRootView);
// 初始化数据.... 不要放在此处初始化数据, 否则会预加载下一个页面
//pager.initData();
return pager.mRootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
//获取到new的Pager
public BasePager getNewsCenterPager(){
return mPagerList.get(1);
}
}
news的大的布局大的ViewPager继承BasePager.java
package com.ldw.news.base.impl;
import java.util.ArrayList;
import android.app.Activity;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.ldw.news.MainActivity;
import com.ldw.news.base.BaseMenuDetailPager;
import com.ldw.news.base.BasePager;
import com.ldw.news.base.menudetails.InteractMenuDetailPager;
import com.ldw.news.base.menudetails.NewsMenuDetailPager;
import com.ldw.news.base.menudetails.PhotoMenuDetailPager;
import com.ldw.news.base.menudetails.TopicMenuDetailPager;
import com.ldw.news.domain.NewsData;
import com.ldw.news.domain.NewsData.NewsMenuData;
import com.ldw.news.fragment.LeftMenuFragment;
import com.ldw.news.global.ClobalContants;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
/**
* 新闻中心
*
* @author Kevin
*
*/
public class NewsCenterPager extends BasePager {
// 4个菜单详情页的集合,填充左侧菜单栏对应的ViewPager中的详情
private ArrayList<BaseMenuDetailPager> mPagers;
private NewsData mNewsData;
public NewsCenterPager(Activity activity) {
super(activity);
}
@Override
public void initData() {
System.out.println("初始化设置数据....");
tvTitle.setText("news");
//btnMenu.setVisibility(View.GONE);// 隐藏菜单按钮
setSlidingMenuEnable(true);// 关闭侧边栏
/*
TextView text = new TextView(mActivity);
text.setText("设置");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
// 向FrameLayout中动态添加布局
flContent.addView(text);
*/
//从服务器中获取数据
getDataFromServer();
}
/*
* 从服务器中获取数据,使用xUtils实现
*/
private void getDataFromServer(){
HttpUtils utils = new HttpUtils();
//参数是String获取到的是String
utils.send(HttpMethod.GET, ClobalContants.CATEGORIES_URL, new RequestCallBack<String>(){
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
//获取到返回的结果
String result = (String) responseInfo.result;
System.out.println("返回结果:" + result);
parseData(result);
}
//访问失败
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
//打印错误信息
error.printStackTrace();
}
});
}
/*
* 解析网络数据
*/
protected void parseData(String result) {
//使用Gson解析
Gson gson = new Gson();
//第一个参数是数据,第二个参数是要转化成什么对象
mNewsData = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:" + mNewsData);
// 刷新测边栏的数据,利用MainActivity获取到左侧边栏的数据
MainActivity mainUi = (MainActivity) mActivity;
//获取到左侧边栏的对象
LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();
//设置网络数据
leftMenuFragment.setMenuData(mNewsData);
//设置4个菜单详情页,LeftMenuFragment和内容的交互,需要调用这里的方法,来初始化侧边栏对应的内容
mPagers = new ArrayList<BaseMenuDetailPager>();
mPagers.add(new NewsMenuDetailPager(mActivity));
mPagers.add(new TopicMenuDetailPager(mActivity));
mPagers.add(new PhotoMenuDetailPager(mActivity));
mPagers.add(new InteractMenuDetailPager(mActivity));
// 设置菜单详情页-新闻为默认当前页
setCurrentMenuDetailPager(0);
}
//设置当前的菜单详情页,显示哪一个详情页,LeftMenuFragment和内容的交互
public void setCurrentMenuDetailPager(int position){
//获取到某一个位置的pager
BaseMenuDetailPager pager = mPagers.get(position);
// 清除之前的布局,fragment布局的内容会叠加
flContent.removeAllViews();
//填充内容,mRebootView就是初始化的某一个子页面,设置给frameLayout
flContent.addView(pager.mRebootView);
// 设置当前页的标题
NewsMenuData menuData = mNewsData.data.get(position);
tvTitle.setText(menuData.title);
pager.initData();// 初始化当前页面的数据
}
}
左侧菜单栏对应右边的详情BaseMenuDetailPager.java,点击左边的菜单右边的内容会切换,这个是及lei
package com.ldw.news.base;
import android.app.Activity;
import android.view.View;
/*
* 点击左侧菜单的时候,右侧显示的详细内容
*/
public abstract class BaseMenuDetailPager {
public Activity mActivity;
public View mRebootView;//根局部
public BaseMenuDetailPager(Activity activity){
mActivity = activity;
mRebootView = initView();
}
/*
* 初始化界面,设置成虚函数,必须实现
*/
public abstract View initView();
/*
* 初始化数据
*/
public void initData(){
}
}
左侧菜单栏点击新闻中心的右边弹出的详情NewsMenuDetailPager.java
package com.ldw.news.base.menudetails;
import android.app.Activity;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import com.ldw.news.base.BaseMenuDetailPager;
/*
* 菜单详情页-新闻
*/
public class NewsMenuDetailPager extends BaseMenuDetailPager {
public NewsMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initView() {
TextView text = new TextView(mActivity);
text.setText("菜单详情页-新闻");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}
1万+

被折叠的 条评论
为什么被折叠?



