android 服务端界面,客户端开发之界面框架的实现

这篇文章中我只讨论界面主题框架的实现,为了满足大多数人的需求,讲的比较基础。客户端是采用了目前比较流行的设计方式:

1420093019136552.jpg

底部的tab菜单是总的导航,每点击一个tab将显示不同的内容。

一、主界面的实现

注意到上图中整个界面是三部分组成的actionbar、内容区域、以及底部tab选项卡。

actionbar部分只要设置成holo主题自然就会有,但是下面的内容区域和tab选项卡部分是这样布局的activity_main.xml:<?xml  version="1.0" encoding="utf-8"?>

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#FFFFFF">

android:id="@+id/pager"

android:layout_width="match_parent"

android:layout_height="0dip"

android:layout_weight="1"

/>

其中内容区域是一个ViewPager,占满了除开actionbar和tab选项卡之外的所有内容。这是如何做到的呢?

这里面是一个高度写死了的布局。然后在ViewPager中,我们让

android:layout_height="0dip"

android:layout_weight="1"

就可以实现ViewPager自动占满。

这样上中下布局就实现了。

二、底部Tab效果的实现

底部tab就是上面提到的main_footer中包含的内容。

实现的思路

底部的tab切换效果我们是使用RadioGroup来实现的,使用RadioGroup的理由有如下几点:

(1)RadioGroup中的元素有state_checked、state_pressed、state_focused三种基本状态,可以在drawable中对这三种状态分别设置不同颜色或者图标。

(2)RadioGroup不同元素之间的state_checked状态是互斥的,当其中一个被选中其他的元素会自动变为未选中。

(3)RadioGroup自带对选中变化事件的监听:onCheckedChanged。

当然有一个理由阻止你选择RadioGroup,那就是RadioGroup默认的样式太难看(圆圈里面一个点),而你往往又不知道其实这种样式是可以轻易改变的:

只需一行xml代码就可以改变RadioGroup的默认样式:

android:button="@null"

因此tab部分我们就确定使用RadioGroup了

代码

下面是tab部分的xml代码:main_footer.xml<?xml  version="1.0" encoding="utf-8"?>

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

android:id="@+id/main_linearlayout_footer"

android:layout_width="fill_parent"

android:layout_height="55dip"

android:background="#33333333"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content">

使用android:button="@null" android:drawableTop="@drawable/tab_blog" 两个属性可以去掉RadioButton的默认圆圈,同时为RadioButton增加一个图标。为什么不同的状态下图标可以呈现不同的颜色呢,请看tab_blog.xml的定义:<?xml  version="1.0" encoding="utf-8"?>

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

tab_blog其实是一个selector,有三种状态,其中选中和获取焦点状态下图标为widget_bar_news_over.png,而未选中状态下图标为widget_bar_news_nor.png这两个图标只有一个区别,颜色不同。

同样的道理要使RadioButton的文字颜色不同我只需设置style属性:style="@style/GreenTabBar"

GreenTabBar.xml的定义(在values/style.xml中)

@drawable/green_tabbar_reverse_drawable

然后green_tabbar_reverse_drawable.xml 就是描述文字颜色的drawable了:<?xml  version="1.0" encoding="utf-8"?>

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

可见设置文字颜色比设置图标多了一个步骤。green_tabbar_reverse_drawable.xml的状态要比之前描述图标的多了很多,其实应该以这个为准。

同样我们还可以设置不同状态下RadioButton的背景颜色(android:background="@drawable/***" ),就不赘述了。

三、监听选项卡切换事件并改变主内容区域

在MainActivity中实现的,下面是主要代码:public class MainActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener{

private RadioGroup mRadioGroup;

private ViewPager mPager;

private TabAdapter mAdapter;

private ArrayList mFragments;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mPager = (ViewPager)findViewById(R.id.pager);

mRadioGroup  = (RadioGroup)findViewById(R.id.rg_tabs);

mRadioGroup.check(R.id.tab_blog);

mRadioGroup.setOnCheckedChangeListener(this);

mFragments = new ArrayList();

mFragments.add(new CategoryGridFragment());

mFragments.add(CodeListFragment.newInstance());

mFragments.add(new QuestionListFragment());

mFragments.add(new CategoryGridFragment());

mAdapter = new TabAdapter(getSupportFragmentManager(),mFragments);

mPager.setAdapter(mAdapter);

mPager.setOffscreenPageLimit(5);

}

@Override

public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {

switch (checkedId){

case R.id.tab_blog:

mPager.setCurrentItem(0,false);

break;

case R.id.tab_code:

mPager.setCurrentItem(1,false);

break;

case R.id.tab_ask:

mPager.setCurrentItem(2,false);

break;

}

}

}

通过mRadioGroup.setOnCheckedChangeListener(this); 我们将监听的任务交给了MainActivity自身,因此MainActivity必须实现onCheckedChanged方法。

在onCheckedChanged方法中,根据不同的选中状态,通过mPager.setCurrentItem来改变ViewPgaer显示的页,就改变了主内容区域的内容。

从上面的代码中还可以看到,ViewPager的每一个Page是一个Fragment,一个Fragment维护着一个界面。这几个Fragment分别是:CategoryGridFragment、CodeListFragment、QuestionListFragment、因为第四个界面还没有写好,第四个fragment暂时还是CategoryGridFragment。

在接下来的文章中我们将分别对这几个模块做介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用android studio 运行,下面是一个简单的文档,这个代码是一个demo 一、Activity的使用 1、SNActivity 框架最基本的activity,可调用$(SNManager)进行操作activity,具体用法请参考文档或代码 2、SNNavigationSlidingActivity 包含SNActivity的功能,继承于com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity 支持导航条和左滑视图的Activity 加载导航条: loadNavBar(int height,int background_color_id) loadNavBarResId(int height_id,int background_id) 加载左侧视图: /** * load left view * @param left_id left layout id * @param offset_value offset value * @param shadow_width_value shadow width value * @param shadow_drawable_id shadow drawable style * @param fade fade value */ loadLeft(int left_id, int offset_value, int shadow_width_value, int shadow_drawable_id, float fade) /** * load left view * @param left_id left layout id * @param offset_id offset id * @param shadow_width_id shadow width id * @param shadow_drawable_id shadow drawable id * @param fade fade value */ loadLeftResId(int left_id, int offset_id, int shadow_width_id, int shadow_drawable_id, float fade) 二、SNElement的使用 View的伪装对象,支持所有View的功能,详细功能可参考文档或代码 手动伪装:$.create $.id $.findView 注入伪装:$.setContent(view class or layout id,inject class); 获取原型:elem.toView(); 三、注入 1、视图注入 A、创建注入类,属性名称必须和layout中的id对应,如果不对应请加入标签@SNInjectView class DemoInject{ @SNInjectView(id=R.id.tvTest) public SNElement test; } B、实例化注入对象 DemoInject di=new DemoInject(); C、调用$.inject或者$.setContent注入 $.inject(di); D、注入成功后即可调用对象 String text=di.test.text(); 2、依赖注入 A、需要绑定注入对象,建议写到Application中的onCreate SNBindInjectManager.instance().bind(ITest.class, Test.class); B、与视图注入不同的是属性必须添加标签@SNIOC,注入的对象(Test)必须包含只有一个SNManager参数的构造函数,且必须实现注入者 public class Test implements ITest{ SNManager $; public Test(SNManager _$){ this.$=_$; }; } class DemoInject{ @SNIOC public ITest test; } C、调用$.inject或者$.setContent注入 同视图注入 D、注入成功后即可调用对象 di.test.xxx(); 四、fragment的使用 1、SNFragment 2、SNLazyFragment 五、控件的使用 1、SNFragmentScrollable 2、SNPercentLinearLayout、SNPercentRelativeLayout 3、SNScrollable 4、SNSlipNavigation 5、XList 6、slidingtab
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值