黑马北京新闻项目连载(2)---侧滑菜单栏、主页面Fragment搭建

本文主要是介绍黑马北京新闻项目连载(2)---侧滑菜单栏、主页面Fragment搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目Json数据下载地址。。。

北京新闻框架代码

侧滑开源库下载。。。

xutil库下载,,,


先看总体的导图


看ui图




************************************************先看整体布局开始********************************************************************

先实现下面的结构图



先看整体布局activity_main.xml--先放空白的framelayout然后进行替换

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fl_content"android:background="#fff"android:layout_width="match_parent"android:layout_height="match_parent" ></FrameLayout>

在看侧栏的布局left_menu.xml--先放空白的framelayout然后进行替换

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fl_left_menu"android:layout_width="match_parent"android:layout_height="match_parent" ></FrameLayout>

MainActivity 入口代码

package com.itheima.zhbj52;import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Window;import com.itheima.zhbj52.fragment.ContentFragment;
import com.itheima.zhbj52.fragment.LeftMenuFragment;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;/*** 主页面功能:* 1、初始化加载主页面布局--该布局是一个framelayout布局, 目的地transaction.replace将主页布局直接进行替换即可!!!!* 2、提供2个方法,用来获取左侧栏目、主页布局的方法*/
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);requestWindowFeature(Window.FEATURE_NO_TITLE);/*** 初始化加载主页面布局--该布局是一个framelayout布局* 目的地transaction.replace将主页布局直接进行替换即可!!!!*/setContentView(R.layout.activity_main);/*** 初始化设置侧栏--该布局也是一个framelayout布局* 目的地transaction.replace将侧边布局直接进行替换即可!!!!*/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();// 开启事务transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),FRAGMENT_LEFT_MENU);// 用fragment替换framelayouttransaction.replace(R.id.fl_content, new ContentFragment(),FRAGMENT_CONTENT);transaction.commit();// 提交事务}/***  获取侧边栏fragment* @return*/public LeftMenuFragment getLeftMenuFragment() {FragmentManager fm = getSupportFragmentManager();LeftMenuFragment fragment = (LeftMenuFragment) fm.findFragmentByTag(FRAGMENT_LEFT_MENU);return fragment;}/*** 获取主页面fragment* @return*/public ContentFragment getContentFragment() {FragmentManager fm = getSupportFragmentManager();ContentFragment fragment = (ContentFragment) fm.findFragmentByTag(FRAGMENT_CONTENT);return fragment;}}

左右两侧都是fragment,有必要将其抽取一个公共的基类

BaseFragment

package com.itheima.zhbj52.fragment;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;/*** 主页、侧栏的fragment基类* 功能:* 1、onCreate获取依托的activity* 2、onCreateView返回展现页面的布局文件,并且提供抽象方法,让子类去具体实现* 3、onActivityCreated进行初始数据用*/
public abstract class BaseFragment extends Fragment {public Activity mActivity;/*** 在 onCreate可以获取依附的mActivity*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivity = getActivity();}/***  处理fragment的布局*  这里返回fragment的布局文件*/@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return initViews();}// 依附的activity创建完成@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);initData();}// 子类必须实现初始化布局的方法public abstract View initViews();// 初始化数据, 可以不实现public void initData() {}}


***********************************************接下来实现侧栏代码之前先看侧栏布局文件吧--侧栏是一个listview*********************************************************


fragment_left_menu.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000" ><ListViewandroid:id="@+id/lv_list"android:layout_width="match_parent"android:layout_height="wrap_content"android:listSelector="@android:color/transparent"android:divider="@android:color/transparent"android:layout_marginTop="40dp" /></RelativeLayout>

既然是listview,那么下来的布局就是每一个item的布局

list_menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="10dp" ><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:drawableLeft="@drawable/btn_menu_selector"android:drawablePadding="5dp"android:enabled="false"android:text="新闻"android:textColor="@drawable/text_menu_selector"android:textSize="25sp" /></LinearLayout>

btn_menu_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_enabled="true" android:drawable="@drawable/menu_arr_select"/><item android:drawable="@drawable/menu_arr_normal"/></selector>

text_menu_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_enabled="true" android:color="#f00"/><item android:color="@android:color/white"/></selector>

LeftMenuFragment

package com.itheima.zhbj52.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.itheima.zhbj52.MainActivity;
import com.itheima.zhbj52.R;
import com.itheima.zhbj52.base.impl.NewsCenterPager;
import com.itheima.zhbj52.domain.NewsData;
import com.itheima.zhbj52.domain.NewsData.NewsMenuData;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;/*** 侧边栏* 功能:* 1、initViews中初始化自己的布局* 2、setMenuData提供一个方法,获取网络数据,这个方法是在NewsCenterPager中进行回传填充的*  刷新测边栏的数据MainActivity mainUi = (MainActivity) mActivity;LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();leftMenuFragment.setMenuData(mNewsData);3、initData这里只是触发点击时间,去更新主页面的内容而已*/
public class LeftMenuFragment extends BaseFragment {//数据源--每个选项是一个NewsMenuData对象(通过json获取封装对象)private ArrayList<NewsMenuData> mMenuList;/*** 获取控件--布局是一个listView展现--新闻、专题、组图、互动4个菜单选项*/@ViewInject(R.id.lv_list)private ListView lvList;private MenuAdapter mAdapter;//适配器private int mCurrentPos;// 当前被点击的菜单项/*** 初始化侧栏的布局*/@Overridepublic View initViews() {//布局里面是一个listView展现4个菜单选项View view = View.inflate(mActivity, R.layout.fragment_left_menu, null);ViewUtils.inject(this, view);return view;}/*** 初始化左边侧栏的数据--4个菜单选项*/@Overridepublic void initData() {lvList.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//点击任何一个菜单选项,赋值成为当前的postionmCurrentPos = position;//通知界面刷新mAdapter.notifyDataSetChanged();// 设置当前菜单详情页?????setCurrentMenuDetailPager(position);// 当点击任何一项,要求关闭侧栏toggleSlidingMenu();}});}/************************ 切换SlidingMenu的状态* 通过侧栏fragment可以获取依托的activity,在那里可以获取getSlidingMenu,进行左侧栏的操作*/protected void toggleSlidingMenu() {MainActivity mainUi = (MainActivity) mActivity;SlidingMenu slidingMenu = mainUi.getSlidingMenu();slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示}/*** 设置当前菜单详情页*/protected void setCurrentMenuDetailPager(int position) {MainActivity mainUi = (MainActivity) mActivity;ContentFragment fragment = mainUi.getContentFragment();// 获取主页面fragmentNewsCenterPager pager = fragment.getNewsCenterPager();// 获取新闻中心页面pager.setCurrentMenuDetailPager(position);// 设置当前菜单详情页}/***************************************  设置网络数据*  这个方法是在NewsCenterPager中进行回传填充的* @param data*/public void setMenuData(NewsData data) {mMenuList = data.data;mAdapter = new MenuAdapter();lvList.setAdapter(mAdapter);}/*** 侧边栏数据适配器*/class MenuAdapter extends BaseAdapter {@Overridepublic int getCount() {return mMenuList.size();}@Overridepublic NewsMenuData getItem(int position) {return mMenuList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = View.inflate(mActivity, R.layout.list_menu_item, null);TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);NewsMenuData newsMenuData = getItem(position);tvTitle.setText(newsMenuData.title);/*** 在初始化的时候,在没有点击选择菜单条目的时候,mCurrentPos为0* 当view绘制到postion==0时候,就将新闻菜单选项,字体变为红色,其他变为白色* 在进行点击操作时候mAdapter.notifyDataSetChanged();会通知界面刷新重新绘制界面* 这样就会将点击的菜单选项绘制成红色*/if (mCurrentPos == position) {// 判断当前绘制的view是否被选中// 显示红色tvTitle.setEnabled(true);} else {// 显示白色tvTitle.setEnabled(false);}return view;}}}

*******************************************接下来实现ContentFragment代码之前先看布局文件吧,是一个自定义viewPager+Tab栏********************************************


fragment_content.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><com.itheima.zhbj52.view.NoScrollViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><RadioGroupandroid:id="@+id/rg_group"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/bottom_tab_bg"android:orientation="horizontal" ><RadioButtonandroid:id="@+id/rb_home"style="@style/BottomTabStyle"android:drawableTop="@drawable/btn_tab_home_selector"android:text="首页" /><RadioButtonandroid:id="@+id/rb_news"style="@style/BottomTabStyle"android:drawableTop="@drawable/btn_tab_news_selector"android:text="新闻中心" /><RadioButtonandroid:id="@+id/rb_smart"style="@style/BottomTabStyle"android:drawableTop="@drawable/btn_tab_smart_selector"android:text="智慧服务" /><RadioButtonandroid:id="@+id/rb_gov"style="@style/BottomTabStyle"android:drawableTop="@drawable/btn_tab_gov_selector"android:text="政务" /><RadioButtonandroid:id="@+id/rb_setting"style="@style/BottomTabStyle"android:drawableTop="@drawable/btn_tab_setting_selector"android:text="设置" /></RadioGroup></LinearLayout>

  <!-- 低栏RadioButton的样式 --><style name="BottomTabStyle"><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:layout_gravity">center_vertical</item><item name="android:button">@null</item><item name="android:drawablePadding">3dp</item><item name="android:padding">5dp</item><item name="android:textColor">@drawable/btn_tab_text_selector</item><item name="android:layout_weight">1</item><item name="android:gravity">center</item></style>

btn_tab_text_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="#f00" android:state_checked="true"/><item android:color="#fff"/></selector>

btn_tab_news_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/newscenter_press" android:state_checked="true"/><item android:drawable="@drawable/newscenter"/></selector>

NoScrollViewPager--自定义viewPager

package com.itheima.zhbj52.view;import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;/*** 不能左右划的ViewPager* 对事件不拦截、不处理* * */
public class NoScrollViewPager extends ViewPager {public NoScrollViewPager(Context context, AttributeSet attrs) {super(context, attrs);}public NoScrollViewPager(Context context) {super(context);}/***  表示事件是否拦截, 返回false表示不拦截--不处理*  这个是针对,在新闻中心,滑动11个页面进行的不拦截操作,*  默认是拦截的,只有返回false,对子事件不拦截,才对11个页面的滑动切换的事件才可以相应*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent arg0) {return false;}/*** 重写onTouchEvent事件,什么都不用做* 滑动屏幕-不会切换*/@Overridepublic boolean onTouchEvent(MotionEvent arg0) {return false;}
}

ContentFragment

package com.itheima.zhbj52.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.itheima.zhbj52.R;
import com.itheima.zhbj52.base.BasePager;
import com.itheima.zhbj52.base.impl.GovAffairsPager;
import com.itheima.zhbj52.base.impl.HomePager;
import com.itheima.zhbj52.base.impl.NewsCenterPager;
import com.itheima.zhbj52.base.impl.SettingPager;
import com.itheima.zhbj52.base.impl.SmartServicePager;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;/*** 主页内容* 1、initViews中初始化布局,初始化NoScrollViewPager、底部Tab栏视图* * 2、为NoScrollViewPager添加5个界面* 3、初始化首页数据mPagerList.get(0).initData();// 初始化首页数据* 4、setOnPageChangeListener在方法里,初始化对应页面的数据*/
public class ContentFragment extends BaseFragment {// 底部Tab栏目@ViewInject(R.id.rg_group)private RadioGroup rgGroup;/*** 主页的顶部的不能滑动的ViewPager视图控件* onInterceptTouchEvent、onTouchEvent都返回false*/@ViewInject(R.id.vp_content)private ViewPager mViewPager;//数据源头--就是Tab栏目对应的5个界面private ArrayList<BasePager> mPagerList;@Overridepublic View initViews() {View view = View.inflate(mActivity, R.layout.fragment_content, null);ViewUtils.inject(this, view); // 注入view和事件return view;}/*** 初始化数据*/@Overridepublic void initData() {// 默认勾选首页rgGroup.check(R.id.rb_home);// 初始化5个子页面mPagerList = new ArrayList<BasePager>();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());// 监听RadioGroup的选择事件rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.rb_home:// mViewPager.setCurrentItem(0);// 设置当前页面mViewPager.setCurrentItem(0, 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.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {mPagerList.get(arg0).initData();// 获取当前被选中的页面, 初始化该页面数据}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});mPagerList.get(0).initData();// 初始化首页数据}/*** 主界面的适配器* @author Administrator**/class ContentAdapter extends PagerAdapter {@Overridepublic int getCount() {return mPagerList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {BasePager 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);}}/*** 获取新闻中心页面* * @return*/public NewsCenterPager getNewsCenterPager() {return (NewsCenterPager) mPagerList.get(1);}}



这篇关于黑马北京新闻项目连载(2)---侧滑菜单栏、主页面Fragment搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125328

相关文章

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

idea如何开启菜单栏

《idea如何开启菜单栏》文章介绍了如何通过修改IntelliJIDEA的样式文件`ui.lnf.xml`来重新显示被关闭的菜单栏,并分享了解决问题的步骤... 目录ijsdea开启菜单栏第一步第二步总结idea开启菜单栏手贱关闭了idea的js菜单栏,花费了半个小时终于解决,记录并分享一下第一步找

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(