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

来源:互联网 发布:知敬畏,守底线,强党性 编辑:程序博客网 时间:2024/06/05 02:11

菜单栏与内容的交互涉及到通过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";@Overridepublic 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;//当前被点击的菜单栏目//初始化布局@Overridepublic 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(){@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {mCurrentPosition = position;//更新getItem获取的mAdapter.notifyDataSetChanged();//显示右边的详细内容setCurrentMenuDetailPager(position);// 点击以后隐藏左边的菜单栏toggleSlidingMenu();}});}/* * 切换SlidingMenu的状态 */protected void toggleSlidingMenu() {//初始化MainActivity来获取到SlidingMenuMainActivity mainUi = (MainActivity) mActivity;SlidingMenu slidingMenu = mainUi.getSlidingMenu();// 切换状态, 显示时隐藏, 隐藏时显示slidingMenu.toggle();}/* * 设置当前菜单详情页,设置右边对应的内容 * 通过获取到activity来间接的获取到ViewPager中的内容来初始化右边的内容 */protected void setCurrentMenuDetailPager(int position) {//初始化MainActivity来获取到内容FragmentMainActivity mainUi = (MainActivity) mActivity;//获取到内容的fragmentContentFragment 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{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mMenuList.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mMenuList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic 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() {@Overridepublic void onClick(View v) {toggleSlidingMenu();}});}/* * 切换SlidingMenu的状态 */protected void toggleSlidingMenu() {//初始化MainActivity来获取到SlidingMenuMainActivity mainUi = (MainActivity) mActivity;SlidingMenu slidingMenu = mainUi.getSlidingMenu();// 切换状态, 显示时隐藏, 隐藏时显示slidingMenu.toggle();}/** * 初始化数据 */public void initData() {}/** * 设置侧边栏开启或关闭,左侧边栏在MainActivity中 * MainActivity中有SlidingMenu */public void setSlidingMenuEnable(boolean enable) {//获取到MainActivity,这样可以操作slidingMenuMainActivity 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;//初始化布局@Overridepublic View initViews() {View view = View.inflate(mActivity, R.layout.fragment_content, null);//获取的id注入viewViewUtils.inject(this, view);return view;}//初始化数据@Overridepublic void initData(){//默认勾选homerg_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() {@Overridepublic 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(){@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int position) {// 获取当前被选中的页面, 初始化该页面数据mPagerList.get(position).initData();}@Overridepublic void onPageScrollStateChanged(int state) {// TODO Auto-generated method stub}});// 初始化首页数据,因为页面点击的时候才会初始化数据,因此刚进入的时候,第一页没有初始化,需要手动初始化数据mPagerList.get(0).initData();}class ContentAdapter extends PagerAdapter{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mPagerList.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {// TODO Auto-generated method stubreturn view == object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//获取到某个位置的pagerBasePager pager = mPagerList.get(position);//填充布局对象container.addView(pager.mRootView);// 初始化数据.... 不要放在此处初始化数据, 否则会预加载下一个页面//pager.initData();return pager.mRootView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}//获取到new的Pagerpublic 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);}@Overridepublic 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获取到的是Stringutils.send(HttpMethod.GET, ClobalContants.CATEGORIES_URL, new RequestCallBack<String>(){@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {//获取到返回的结果String result = (String) responseInfo.result;System.out.println("返回结果:" + result);parseData(result);}//访问失败@Overridepublic 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){//获取到某一个位置的pagerBaseMenuDetailPager pager = mPagers.get(position);// 清除之前的布局,fragment布局的内容会叠加flContent.removeAllViews();//填充内容,mRebootView就是初始化的某一个子页面,设置给frameLayoutflContent.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);}@Overridepublic View initView() {TextView text = new TextView(mActivity);text.setText("菜单详情页-新闻");text.setTextColor(Color.RED);text.setTextSize(25);text.setGravity(Gravity.CENTER);return text;}}



0 0