ActionBar

相信大家都用过微信,微信的界面我们从上往下看,首先是一个ActionBar,并且自定义了ActionProvider,就是那个“加号”,里面有五个子菜单。今天就来试着模仿微信写一个UI界面。
我们先创建一个主Activity,用于显示微信的主界面:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_main);}
}

接下来在Manifest.xml布局文件中注册,并修改Theme属性(AcitonBar的主题):

<application
        android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@android:style/Theme.Holo.Light"><activity android:name=".MainActivity"android:label="微信"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application>

接下来创建一个MyActionProvider继承自AcitonProvider,并重写onCreateActionView()和onPrepareSubMenu()方法:

public class MyActionProvider extends ActionProvider{public MyActionProvider(Context context) {super(context);}@Overridepublic View onCreateActionView() {return null;}@Overridepublic boolean hasSubMenu() {return true;}@Overridepublic void onPrepareSubMenu(SubMenu subMenu) {subMenu.clear();//注意这个方法subMenu.add("发起群聊").setIcon(R.drawable.item1).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {//添加点击事件return true;}});...//同样方法添加另外4个}
}

其中首先调用hasSubMenu() 方法返回true,表示有子菜单,然后在onPrepareSubMenu()方法中添加子菜单,这里注意subMenu.clear()这个方法,每次点击ActionProvider这个菜单都会调用一次onPrepareSubMenu()方法,如果不是clear()清除一下subMenu会导致没点击一次,就多一倍的子菜单。

完成后就可以开始创建menu的布局文件了,使用android:actionProviderClass属性加入我们刚创建的自定义AcitonProvider:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item
        android:id="@+id/search"android:icon="@drawable/search"android:showAsAction="always"android:title="search" /><item
        android:id="@+id/more"android:actionProviderClass="com.example.app.iminatewui.MyActionProvider"android:icon="@drawable/add"android:showAsAction="always"android:title="more" />
</menu>

别忘了在MainActivity中将加载menu布局文件:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu,menu);return super.onCreateOptionsMenu(menu);}

同时也可以添加点击事件:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){case R.id.search://添加点击事件return true;default:return false;}

这一步到这里就完成了,运行试一下看看:

我没有找到微信的图标素材,于是就找了一些其他图标代替,主要看下效果,如果有微信图标素材就可以直接代替,这样的话就更逼真了。
还发现一个问题,左边的这个图标微信里是没有的,怎么去掉那?也很简单,在MainAcitvity中调用getActionBar()获取到ActionBar的实例,在调用它的setDisplayShowHomeEnabled()方法就可以不显示icon和log:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_main);ActionBar actionBar = getActionBar();actionBar.setDisplayShowHomeEnabled(false);}

这样就OK了:

还有就是细节方面,比如AcitonBar的颜色怎么改,也很简单,先自定义一个style:

<resources><style name="MyTheme" parent="@android:style/Theme.Holo.Light"><item name="android:actionBarStyle">@style/MyActionBar</item></style><style name="MyActionBar" parent="@android:style/Widget.Holo.ActionBar"><item name="android:background">/*你要的颜色或者图片*/</item></style>
</resources>

修改其中actionBarStyle属性的background属性就可以了,然后把Manifest.xml布局文件中Theme属性修改为 android:theme=”@style/MyTheme”。

底部导航页:

还是回到我们MainActivity的布局文件中:

<?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"><FrameLayout
        android:id="@+id/fragment_layout"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1"></FrameLayout><RadioGroup
        android:id="@+id/rg"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButton
            android:id="@+id/main1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/main_background"android:button="@null"android:checked="true"android:drawableTop="@drawable/main1"android:gravity="center"android:text="微信" /><RadioButton
            android:id="@+id/main2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/main_background"android:button="@null"android:drawableTop="@drawable/main2"android:gravity="center"android:text="通讯录" /><RadioButton
            android:id="@+id/main3"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/main_background"android:button="@null"android:drawableTop="@drawable/main3"android:gravity="center"android:text="发现" /><RadioButton
            android:id="@+id/main4"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/main_background"android:button="@null"android:drawableTop="@drawable/main4"android:gravity="center"android:text="我" /></RadioGroup>
</LinearLayout>

这个布局最外面是LinerLayout并且orientation设置时veritcal(垂直),内部是一个FrameLayout用于显示Fragment和一个RadioGroup作为底部导航的按钮。
试着运行下看看效果:

还不错吧!当选中的时候背景色实惠改变了,主要是依靠:

android:background="@drawable/main_background"

这里的@drawable/main_background看代码:

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

就是设置选中和未选中状态设置不同颜色就可以了。
同样的你也可以对字体或者图片实现同样的效果。

接着就是新建4个Fragment,只要重写onCreateView()方法加载对应的布局文件:

public class Fragment1 extends Fragment {@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment1,container,false);return view;}
}

完成后在MainActivity中将Fragment动态地加载进去,并绑定RadioGroup的点击事件:

public class MainActivity extends Activity {private RadioGroup radioGroup;private Fragment1 fragment1;private Fragment2 fragment2;private Fragment3 fragment3;private Fragment4 fragment4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_main);ActionBar actionBar = getActionBar();actionBar.setDisplayShowHomeEnabled(false);radioGroup = (RadioGroup) findViewById(R.id.rg);final FragmentManager fragmentManager = getFragmentManager();fragment1 = new Fragment1();fragmentManager.beginTransaction().add(R.id.fragment_layout,fragment1).commit();radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.main1:fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment1).commit();break;case R.id.main2:if (fragment2 == null) {fragment2 = new Fragment2();}fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment2).commit();break;case R.id.main3:if (fragment3 == null) {fragment3 = new Fragment3();}fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment3).commit();break;case R.id.main4:if (fragment4 == null) {fragment4 = new Fragment4();}fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment4).commit();break;}}});}

动态加载时通过FragmentManager调用beginTransaction()开启事务完成的。
试着运行一下吧~

到这里主界面的Activity基本完成了,谢谢~
下一次会继续完善这个练习,把其他的Activity也添加上!
附上的我代码:https://github.com/huburt-Hu/IminateWechatUI.git

android 小练习(一) ---仿微信UI主界面相关推荐

  1. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具 ...

  2. Android录制视频,仿微信小视频录制(一)

    Android录制视频,第一部分自定义控件 简述 公司有一个录制视频并上传的功能,录制视频具体使用类如下:硬件控制使用Camera,视频录制的格式音频等具体配置与录制使用MediaRecorder,预 ...

  3. Android开源之仿微信UI

     Android开源之仿微信UI 这是一个仿Android版本的微信UI开源项目,该项目实现了微信表面的UI编码设计与实现,尚未实现功能部分.实现了部分页面的跳转逻辑,比如初始页进入主界面.git ...

  4. Android仿微信气泡聊天界面设计

    Android仿微信气泡聊天界面设计 微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素 ...

  5. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  6. Android仿微信语音聊天界面设计

    这篇文章主要为大家详细介绍了Android仿微信语音聊天界面设计代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间 ...

  7. 漂流瓶php源码,微信小程序之仿微信漂流瓶

    [实例简介] 微信小程序之仿微信漂流瓶 [实例截图] [核心代码] a4c6f919-add7-4dc7-bafa-9a884a00f2e3 └── wx_plp ├── app.js ├── app ...

  8. android仿支付提现功能,Android应用开发Android 仿微信支付密码界面

    本文将带你了解Android应用开发Android 仿微信支付密码界面,希望本文对大家学Android有所帮助. 使用 Bundle bundle = new Bundle(); bundle.put ...

  9. php类似微信聊天框,仿微信UI界面的PHP+Swoole多人聊天室 TP6框架

    仿微信UI界面的PHP+Swoole多人聊天室 TP6框架 介绍 基于swoole实现模仿微信的即时通讯聊天室 软件架构 使用thinkphp6编写 安装教程 导入install.sql到数据库 == ...

最新文章

  1. iOS_“图片浏览选择”功能的编写思路
  2. Dell工作站UEFI与BIOS,AHCI与RAID模式
  3. MyEclipse8.x下安装freemarker ide插件
  4. 时代亿信 文件共享访问控制网关
  5. 如何使Putty会话颜色更美观
  6. 使用mcBackup备份Windows 7 Media Center设置
  7. 在pom.xml中配置nexus上传地址
  8. NSTimer 与 Run loop Modes
  9. 合并excel文件 C语言,如何用VBA函数合并多个文件
  10. WebStorm开发插件
  11. C++内存泄漏和内存碎片的产生及避免策略
  12. 协议号(网络层)、端口号(传输层)详解
  13. 无人机倾斜摄影三维建模技术在智慧城市中的应用
  14. OpenAVNU 带宽预留协议SRP代码分析
  15. 信息安全软考——关于DES初始置换表解答题
  16. 我的java学习之路之Spring MVC
  17. [MySQL] 统计图数据查询 (MySQL查询时间范围内所有日期)
  18. 在项目中使用阿里巴巴矢量字体图标
  19. 这套动捕方案居然只用一个摄像头?
  20. gem中gon的用法 (发送数据到js文件)

热门文章

  1. 金仓数据库 KingbaseES 插件参考手册 plsql_plprofiler
  2. 在Windows下安装Oracle 11g的XE(Express版)
  3. java培训班多少费用,该怎么学习呢
  4. 禁止输入框输入空格 onkeyup
  5. 2022年保险从业者可以考哪些高含金量的理财证书?
  6. 练练脑子(1)- 四马换位
  7. 华为模拟器eNSP端口映射配置实验
  8. A collection with cascade=“all-delete-orphan“ was no longer referenced by the owning entity instance
  9. antd rowSpan合并单元格
  10. DropDownMenu