163.n1-菜单栏与内容的交互

菜单栏与内容的交互涉及到通过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;
	}

}



.m-md-n1 { margin: -0.25rem !important; } .m-md-n2 { margin: -0.5rem !important; } .m-md-n3 { margin: -1rem !important; } .m-md-n4 { margin: -1.5rem !important; } .m-md-n5 { margin: -3rem !important; } .m-md-n6 { margin: -5rem !important; } .mx-md-n1 { margin-right: -0.25rem !important; margin-left: -0.25rem !important; } .mx-md-n2 { margin-right: -0.5rem !important; margin-left: -0.5rem !important; } .mx-md-n3 { margin-right: -1rem !important; margin-left: -1rem !important; } .mx-md-n4 { margin-right: -1.5rem !important; margin-left: -1.5rem !important; } .mx-md-n5 { margin-right: -3rem !important; margin-left: -3rem !important; } .mx-md-n6 { margin-right: -5rem !important; margin-left: -5rem !important; } .my-md-n1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .my-md-n2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .my-md-n3 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .my-md-n4 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .my-md-n5 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .my-md-n6 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .mt-md-n1 { margin-top: -0.25rem !important; } .mt-md-n2 { margin-top: -0.5rem !important; } .mt-md-n3 { margin-top: -1rem !important; } .mt-md-n4 { margin-top: -1.5rem !important; } .mt-md-n5 { margin-top: -3rem !important; } .mt-md-n6 { margin-top: -5rem !important; } .me-md-n1 { margin-right: -0.25rem !important; } .me-md-n2 { margin-right: -0.5rem !important; } .me-md-n3 { margin-right: -1rem !important; } .me-md-n4 { margin-right: -1.5rem !important; } .me-md-n5 { margin-right: -3rem !important; } .me-md-n6 { mar
04-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值