Android UI-仿微信底部导航栏布局

简介:

现在App基本的标配除了侧滑菜单,还有一个就是底部导航栏,常见的聊天工具QQ,微信,购物App都有底部导航栏,用户可以随便切换看不同的内容,说是情怀也好,用户体验也罢。我们开发的主要的还是讲的是如何如何实现其功能,网上实现的方式无外乎两种,一种是使用tabhost进行切换,一种是直接使用Fragment进行切换,底部导航栏的布局有的使用的是线性布局,有的是使用的RadioGroup,本文中是使用fragment+RadioGroup是实现的,看正文吧:

基础布局

其中主要低 底部导航栏,其他都没有什么,上面是一个Fragment自己替换一下即可,关于Fragment的使用可参考本人之前的博客;

activity_main.xml中的布局文件,由于样式比较多可以单独的放在style中的,鉴于方便查看,直接放在布局文件中,activity_main中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     xmlns:tools= "http://schemas.android.com/tools"
     android:layout_width= "fill_parent"
     android:layout_height= "fill_parent"
     android:orientation= "vertical"
     tools:context= "com.example.googlebottomfragment.MainActivity"  >
 
 
     <FrameLayout
         android:id= "@+id/main_content"
         android:layout_width= "fill_parent"
         android:layout_height= "0dp"
         android:layout_weight= "1"  />
 
     <RadioGroup
         android:id= "@+id/tab_menu"
         android:layout_width= "fill_parent"
         android:layout_height= "wrap_content"
         android:background= "@drawable/mmfooter_bg"
         android:orientation= "horizontal"  >
 
         <RadioButton
             android:id= "@+id/rbChat"
             android:layout_width= "0dp"
             android:layout_height= "wrap_content"
             android:layout_gravity= "bottom"
             android:layout_weight= "1"
             android:background= "@drawable/tab_selector_checked_bg"
             android:button= "@null"
             android:checked= "true"
             android:drawableTop= "@drawable/tab_selector_weixing"
             android:gravity= "center_horizontal|bottom"
             android:paddingTop= "2dp"
             android:text= "微信"
             android:textColor= "@color/tab_selector_tv_color"  />
 
         <RadioButton
             android:id= "@+id/rbAddress"
             android:layout_width= "0dp"
             android:layout_height= "wrap_content"
             android:layout_gravity= "bottom"
             android:layout_weight= "1"
             android:background= "@drawable/tab_selector_checked_bg"
             android:button= "@null"
             android:drawableTop= "@drawable/tab_selector_tongxunlu"
             android:gravity= "center_horizontal|bottom"
             android:paddingTop= "2dp"
             android:text= "通讯录"
             android:textColor= "@color/tab_selector_tv_color"  />
 
         <RadioButton
             android:id= "@+id/rbFind"
             android:layout_width= "0dp"
             android:layout_height= "wrap_content"
             android:layout_gravity= "bottom"
             android:layout_weight= "1"
             android:background= "@drawable/tab_selector_checked_bg"
             android:button= "@null"
             android:drawableTop= "@drawable/tab_selector_faxian"
             android:gravity= "center_horizontal|bottom"
             android:paddingTop= "2dp"
             android:text= "发现"
             android:textColor= "@color/tab_selector_tv_color"  />
 
         <RadioButton
             android:id= "@+id/rbMe"
             android:layout_width= "0dp"
             android:layout_height= "wrap_content"
             android:layout_gravity= "bottom"
             android:layout_weight= "1"
             android:background= "@drawable/tab_selector_checked_bg"
             android:button= "@null"
             android:drawableTop= "@drawable/tab_selector_wo"
             android:gravity= "center_horizontal|bottom"
             android:paddingTop= "2dp"
             android:text= "我"
             android:textColor= "@color/tab_selector_tv_color"  />
     </RadioGroup>
     
       
 
</LinearLayout>

  看下新建的布局和资源文件:

其中tab_selector_tv_color.xml主要是用于控制切换的时候显示下面字体的颜色:

1
2
3
4
5
6
7
8
<?xml version= "1.0"  encoding= "utf-8" ?>
<selector xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <item android:state_checked= "true"  android:color= "@android:color/white" />
     <item android:state_checked= "false"  android:color= "@android:color/darker_gray" />
     <item android:color= "@android:color/darker_gray" />
 
</selector>

  其中tab_selector_checked_bg.xml布局文件选中的时候每个RadioButtton的背景颜色:

1
2
3
4
5
6
7
8
<?xml version= "1.0"  encoding= "utf-8" ?>
<selector xmlns:android= "http://schemas.android.com/apk/res/android"  >
 
     <item
     android:state_checked= "true"
     android:drawable= "@drawable/tab_bg_halo" />
     
</selector>

 其中tab_selector_weixing.xml主要是点击的时候显示不同的图片,一个是绿色的,一个是白色:

1
2
3
4
5
6
<?xml version= "1.0"  encoding= "utf-8" ?>
<selector xmlns:android= "http://schemas.android.com/apk/res/android"  >
     <item android:state_checked= "false"  android:drawable= "@drawable/tab_weixin_normal" ></item>
     <item android:state_checked= "true"  android:drawable= "@drawable/tab_weixin_pressed" ></item>
 
</selector>

  其中需要切换的chat.xml,address.xml,find.xml,me.xml都是一样的,其中chat.xml代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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= "match_parent"
     android:orientation= "vertical"  >
     
     <TextView
         android:layout_height= "wrap_content"
         android:layout_width= "wrap_content"
         android:text= "微信"
         android:textSize= "20sp"
       />
       <TextView
         android:layout_height= "wrap_content"
         android:layout_width= "wrap_content"
         android:text= "http://www.cnblogs.com/xiaofeixiang"
         android:textSize= "15sp"
       />
     
 
</LinearLayout>

 实现Demo

MainActivity.java中的代码,主要的就是设置一下OnCheckedChangeListener,注意MainActivity中需要继承FragmentActivity:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public  void  initView() {
     chat =  new  FragmentChat();
     getSupportFragmentManager().beginTransaction().replace(R.id.main_content, chat).commit();
     myTabRg = (RadioGroup) findViewById(R.id.tab_menu);
     myTabRg.setOnCheckedChangeListener( new  OnCheckedChangeListener() {
 
 
         @Override
         public  void  onCheckedChanged(RadioGroup group,  int  checkedId) {
             // TODO Auto-generated method stub
             switch  (checkedId) {
             case  R.id.rbChat:
                 chat =  new  FragmentChat();
                 getSupportFragmentManager().beginTransaction().replace(R.id.main_content, chat)
                         .commit();
                 break ;
             case  R.id.rbAddress:
                 if  (address== null ) {
                     address = new  FragmentAddress();
                 }
                 Log.i( "MyFragment" "FragmentAddress" );
                 getSupportFragmentManager().beginTransaction().replace(R.id.main_content, address).commit();
                 break ;
             case  R.id.rbFind:
                 find =  new  FragmentFind();
                 getSupportFragmentManager().beginTransaction().replace(R.id.main_content, find)
                         .commit();
                 break ;
             case  R.id.rbMe:
                 me =  new  FragmentMe();
                 getSupportFragmentManager().beginTransaction().replace(R.id.main_content, me)
                         .commit();
                 break ;
             default :
                 break ;
             }
 
         }
     });

 FragmentChat中的代码,其余的三个FragmentAddress,FragmentFind,FragmentMe类似,就不贴代码了,主要是继承Fragment 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  class  FragmentChat  extends  Fragment {
 
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onCreate(savedInstanceState);
     }
 
     @Override
     public  View onCreateView(LayoutInflater inflater,
             @Nullable  ViewGroup container,  @Nullable  Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         return  inflater.inflate(R.layout.chat,  null );
     }
 
}

  最后看张通讯录的截图吧:

、-

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4156732.html,如需转载请自行联系原作者

相关文章
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
19天前
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
133 67
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
4月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
75 10
|
23天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
1月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
40 2
|
2月前
|
Android开发 开发者 容器
flutter:&UI布局 (六)
本文档介绍了Flutter中的UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局等。通过具体示例代码展示了如何使用这些布局组件来构建灵活多变的用户界面,例如使用Column垂直排列文本、使用Stack叠加组件、以及利用Wrap实现自动换行的按钮布局等。
|
3月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
87 1
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
174 0
|
4月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!