天天看点

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

最近在学车,抽着空写了一个常用的app框架,可惜不会制作gif图片,请忽略录屏软件的那个浮动窗口,要是有更好的方式制作gif麻烦告知下提前感谢,效果图如下,凑合着看下吧。

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

主要实现了

【1】使用radiogroup处理选项卡优化布局

【2】使用toolbar跟侧滑图表联动,效果更好

【3】集合了viewerpager+fragment,drawerlayout+toolbar,optionmenu以及circleimageview处理头像等功能

一般app项目应该可以应付了。下面说下实现

这里使用了radiogroup,以前用的是多层linearlayout结合weight属性,再使用imageview和textview感觉有点过度绘制,这里做了优化采用radiogroup

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>  

<relativelayout  

    android:id="@+id/bottom"  

    xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent">  

    <radiogroup  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:layout_alignparentbottom="true"  

        android:background="@color/mainpage_mycrircle_leftview_item_auth_name"  

        android:orientation="horizontal">  

        <radiobutton  

            android:id="@+id/id_tab_mycircle"  

            style="@style/style_radiobutton"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content"  

            android:checked="true"  

            android:drawabletop="@drawable/mainpage_tab_mycircle"  

            android:text="我的圈子"  

            />  

            android:id="@+id/id_tab_discovery"  

            android:drawabletop="@drawable/mainpage_tab_discovery"  

            android:text="发现"/>  

            android:id="@+id/id_tab_message"  

            android:drawabletop="@drawable/mainpage_tab_message"  

            android:text="消息"/>  

            android:id="@+id/id_tab_setting"  

            android:drawabletop="@drawable/mainpage_tab_setting"  

            android:text="个人中心"  

    </radiogroup>  

</relativelayout>  

</span>  

出来的效果是这样的感觉还可以,布局也很简单

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

不过要注意对radiobutton的style做一番更改换掉原来的属性 styles.xml中

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;"><style name="style_radiobutton">  

        <item name="android:button">@null</item>  

        <item name="android:background">@null</item>  

        <item name="android:layout_weight">0.25</item>  

        <item name="android:gravity">center</item>  

        <item name="android:textcolor">@color/gray</item>  

        <item name="android:textsize">12sp</item>  

    </style></span>  

主要是viewpager使用的fragmentpageradapter 

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;">private void initviewpages() {  

        //初始化四个布局  

        fragment01 tab01 = new fragment01();  

        fragment02 tab02 = new fragment02();  

        fragment03 tab03 = new fragment03();  

        fragment04 tab04 = new fragment04();  

        mfragments.add(tab01);  

        mfragments.add(tab02);  

        mfragments.add(tab03);  

        mfragments.add(tab04);  

        //初始化adapter这里使用fragmentpageradapter  

        madpter = new fragmentpageradapter(getsupportfragmentmanager()) {  

            @override  

            public fragment getitem(int position) {  

                return mfragments.get(position);  

            }  

            public int getcount() {  

                return mfragments.size();  

        };  

        mviewpager.setadapter(madpter);  

    }</span>  

然后逻辑处理在mainactivity的initevent()中,对radiogroup和viewpager滑动监听

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;"> //监听radiogroup  

        mgroup.setoncheckedchangelistener(new radiogroup.oncheckedchangelistener() {  

            public void oncheckedchanged(radiogroup group, int checkedid) {  

                switch (checkedid) {  

                    case r.id.id_tab_mycircle:  

                        mviewpager.setcurrentitem(0, false);  

                        break;  

                    case r.id.id_tab_discovery:  

                        mviewpager.setcurrentitem(1, false);  

                    case r.id.id_tab_message:  

                        mviewpager.setcurrentitem(2, false);  

                    case r.id.id_tab_setting:  

                        mviewpager.setcurrentitem(3, false);  

                    default:  

                }  

        });  

        //监听page滑动  

        mviewpager.addonpagechangelistener(new viewpager.onpagechangelistener() {  

            public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {  

            public void onpageselected(int position) {  

                //当viewpager滑动的时候  

                switch (position) {  

                    case 0:  

                        mgroup.check(r.id.id_tab_mycircle);  

                    case 1:  

                        mgroup.check(r.id.id_tab_discovery);  

                    case 2:  

                        mgroup.check(r.id.id_tab_message);  

                    case 3:  

                        mgroup.check(r.id.id_tab_setting);  

            public void onpagescrollstatechanged(int state) {  

drawerlayout使用比较简单,必须把drawerlayout作为布局的跟标签。然后在跟标签中添加一个包含内容的视图,就是当抽屉完全隐藏的时候显示的内容布局,然后 添加的就是抽屉布局,这个布局可以按照需求自己定义,顺序不要搞反了

本例的抽屉布局drawerlayout.xml代码如下

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<android.support.v4.widget.drawerlayout  

    android:id="@+id/id_drawerlayout"  

    xmlns:app="http://schemas.android.com/apk/res-auto"  

    <relativelayout  

        xmlns:android="http://schemas.android.com/apk/res/android"  

        android:layout_height="match_parent"  

        android:background="@color/white">  

        <radiogroup  

            android:id="@+id/radiogroup"  

            android:layout_width="match_parent"  

            android:layout_alignparentbottom="true"  

            android:background="@color/mainpage_mycrircle_leftview_item_auth_name"  

            android:orientation="horizontal">  

            <radiobutton  

                android:id="@+id/id_tab_mycircle"  

                style="@style/style_radiobutton"  

                android:layout_width="wrap_content"  

                android:layout_height="wrap_content"  

                android:checked="true"  

                android:drawabletop="@drawable/mainpage_tab_mycircle"  

                android:text="我的圈子"  

                />  

                android:id="@+id/id_tab_discovery"  

                android:drawabletop="@drawable/mainpage_tab_discovery"  

                android:text="发现"/>  

                android:id="@+id/id_tab_message"  

                android:drawabletop="@drawable/mainpage_tab_message"  

                android:text="消息"/>  

                android:id="@+id/id_tab_setting"  

                android:drawabletop="@drawable/mainpage_tab_setting"  

                android:text="个人中心"  

        </radiogroup>  

        <android.support.v4.view.viewpager  

            android:id="@+id/id_viewpager"  

            android:layout_above="@id/radiogroup"  

            >  

        </android.support.v4.view.viewpager>  

    </relativelayout>  

    <linearlayout  

        android:id="@+id/id_drawer"  

        android:layout_width="240dp"  

        android:layout_gravity="start"  

        android:background="#e0eee0"  

        android:orientation="vertical">  

        <com.elvis.utils.circleimageview  

            android:layout_gravity="center"  

            android:layout_margintop="10dp"  

            android:src="@drawable/xsfelvis"  

            app:border_color="@color/page_item_black_50"  

            app:border_width="2dp"  

        <linearlayout  

            <imageview  

                android:src="@drawable/banner_left"  

            <textview  

                android:gravity="center"  

                android:paddingtop="5dp"  

                android:text="xsfelvis"  

                android:textsize="15sp"  

                android:src="@drawable/banner_right"  

        </linearlayout>  

        <listview  

            android:id="@+id/id_lv"  

            android:layout_margintop="20dp"  

            android:cachecolorhint="#00000000"  

            android:footerdividersenabled="false"  

            android:gravity="center"  

            android:listselector="@android:color/transparent">  

        </listview>  

    </linearlayout>  

</android.support.v4.widget.drawerlayout>  

我们可以看出,内容布局在relativelayout中,抽屉布局在linearlayout中,内容布局包含radiogroup,viewpager俩部分,而抽屉布局包含一个circleimageview和一个listview

由于toolbar是继承自view,所以可以像其他标准控件一样直接主布局文件添加toolbar,但是为了提高toolbar的重用效率,可以在layout创建一个custom_toolbar.xml代码如下:

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<android.support.v7.widget.toolbar  

    android:id="@+id/tl_custom"  

    android:layout_height="wrap_content"  

    android:background="?attr/colorprimarydark"  

    android:fitssystemwindows="true"  

    android:minheight="?attr/actionbarsize"  

    android:popuptheme="@style/themeoverlay.appcompat.light"  

    app:theme="@style/themeoverlay.appcompat.actionbar">  

</android.support.v7.widget.toolbar>  

使用toolbar一定要将styles中apptheme重新设置styles.xml

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;">   <style name="appbasetheme" parent="theme.appcompat.light.noactionbar">  

        <!-- 状态栏和标题栏颜色-->  

        <!--<item name="colorprimary">@color/colorprimary</item>  

        <item name="colorprimarydark">@color/colorprimarydark</item>-->  

        <item name="colorprimarydark">@color/indigo_colorprimarydark</item>  

        <!--toolbar颜色-->  

        <item name="colorprimary">@color/indigo_colorprimary</item>  

        <!-- 标题颜色-->  

        <item name="android:textcolorprimary">@android:color/white</item>  

        <!-- 溢出菜单图标颜色-->  

        <item name="colorcontrolnormal">@android:color/white</item>  

        <!-- 箭头 -->  

        <item name="drawerarrowstyle">@style/drawerarrowstyle</item>  

        <!-- 溢出菜单文字颜色-->  

        <item name="textappearancelargepopupmenu">@style/overflowmenutextappearance</item>  

        <!-- 菜单项点击selector-->  

        <item name="actionbaritembackground">@drawable/abc_item_background_holo_dark</item>  

    </style>  

    <!-- 左边的箭头指示-->  

    <style name="drawerarrowstyle" parent="widget.appcompat.drawerarrowtoggle">  

        <item name="spinbars">true</item>  

        <item name="color">@android:color/white</item>  

    <!--option菜单文字样式-->  

    <style name="overflowmenutextappearance" parent="@style/textappearance.appcompat.widget.popupmenu.large">  

        <item name="android:textcolor">@color/overflowtextcolor</item>  

从效果图也可以看出,我们在滑动中从横线变为箭头,效果有点炫酷,在mainactivity.java中initevent()中

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;">  //toolbar  

        toolbar.settitle("app framework");//设置toolbar标题  

        toolbar.settitletextcolor(color.parsecolor("#ffffff")); //设置标题颜色  

        setsupportactionbar(toolbar);  

        getsupportactionbar().setdisplayhomeasupenabled(true);  

        getsupportactionbar().sethomebuttonenabled(true);  

        mdrawertoggle = new actionbardrawertoggle(this,  

                mdrawerlayout,  

                toolbar,  

                r.string.drawopen,  

                r.string.drawclose) {  

            public void ondraweropened(view drawerview) {  

                super.ondraweropened(drawerview);  

                toolbar.settitle("侧滑栏");  

            public void ondrawerclosed(view drawerview) {  

                super.ondrawerclosed(drawerview);  

                toolbar.settitle("app framework");  

        mdrawertoggle.syncstate();  

        mdrawerlayout.setdrawerlistener(mdrawertoggle);  

    }  

菜单显示出图标,我们需要重新一个方法,使用反射让其显示出来

一起来搭简单的App框架1、概述 2、选项卡按钮 3、ViewPager+fragment实现选项卡内容区域 4、侧滑联动 5、optionMeun设置

<span style="font-size:18px;">    @override  

    public boolean onmenuopened(int featureid, menu menu) {  

        if (menu != null) {  

            if (menu.getclass().getsimplename().equals("menubuilder")) {  

                try {  

                    method m = menu.getclass().getdeclaredmethod(  

                            "setoptionaliconsvisible", boolean.type);  

                    m.setaccessible(true);  

                    m.invoke(menu, true);  

                } catch (nosuchmethodexception e) {  

                    e.printstacktrace();  

                } catch (invocationtargetexception e) {  

                } catch (illegalaccessexception e) {  

        }  

        return false;//关闭系统menu按键  

最后记得return false 否则你按系统的menu也会从下方出来menu菜单,感觉不是很好看。

转自:http://blog.csdn.net/xsf50717/article/details/49799485

继续阅读