android M拨号盘开源之旅(二)--- 浅析拨号盘主界面

接上篇博文:http://www.cnblogs.com/lance2016/p/5229073.html

上一节课给大家简单介绍了下android拨号盘的工程概况,今天再向大家剖析一下主界面的布局实现

先贴上主界面布局:

<?xml version="1.0" encoding="utf-8"?><FrameLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/dialtacts_mainlayout"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:focusable="true"    android:focusableInTouchMode="true"    android:clipChildren="false"    android:background="@color/background_dialer_light">    <FrameLayout        android:id="@+id/dialtacts_container"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clipChildren="false">        <!-- The main contacts grid -->        <FrameLayout            android:layout_height="match_parent"            android:layout_width="match_parent"            android:id="@+id/dialtacts_frame"            android:clipChildren="false" />    </FrameLayout>    <FrameLayout        android:id="@+id/floating_action_button_container"        android:background="@drawable/fab_blue"        android:layout_width="@dimen/floating_action_button_width"        android:layout_height="@dimen/floating_action_button_height"        android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"        android:layout_gravity="center_horizontal|bottom">        <ImageButton            android:id="@+id/floating_action_button"            android:background="@drawable/floating_action_button"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:contentDescription="@string/action_menu_dialpad_button"            android:src="@drawable/fab_ic_dial"/>    </FrameLayout></FrameLayout>




xml比较简单,我们看看DialtactsActivity里的实现

final ActionBar actionBar = getActionBar();actionBar.setCustomView(R.layout.search_edittext);actionBar.setDisplayShowCustomEnabled(true);actionBar.setBackgroundDrawable(null);

SearchEditTextLayout searchEditTextLayout =        (SearchEditTextLayout) actionBar.getCustomView().findViewById(R.id.search_view_container);searchEditTextLayout.setPreImeKeyListener(mSearchEditTextLayoutListener);

mActionBarController = new ActionBarController(this, searchEditTextLayout);

菜单控制器private ActionBarController mActionBarController;

用来管理SearchEditTextLayout对象(actionbar的customview)



接下来是主界面fragment(快速拨号,通话记录,联系人)

private ListsFragment mListsFragment;

放在dialtacts_frame容器里

getFragmentManager().beginTransaction().add(R.id.dialtacts_frame, new ListsFragment(), TAG_FAVORITES_FRAGMENT).commit();


全局搜索fragment private RegularSearchFragment mRegularSearchFragment;(在actionbar的edittext里输入号码呈现结果集的fragment)
拨号搜索fragment private SmartDialSearchFragment mSmartDialSearchFragment; (在拨号盘里输入号码呈现结果集的fragment)

都放在dialtacts_frame容器里(根据是否处于搜索模式动态创建和移除)

private void enterSearchUi(boolean smartDialSearch, String query, boolean animate) 
if (smartDialSearch) {    fragment = new SmartDialSearchFragment();} else {  fragment = new RegularSearchFragment();}

transaction.add(R.id.dialtacts_frame, fragment, tag);

private void exitSearchUi() 
if (mSmartDialSearchFragment != null) {    transaction.remove(mSmartDialSearchFragment);}

if (mRegularSearchFragment != null) {
    transaction.remove(mRegularSearchFragment);

}



拨号盘fragment

protected DialpadFragment mDialpadFragment;

放在dialtacts_container容器里

if (mDialpadFragment == null) {    mDialpadFragment = new DialpadFragment();    ft.add(R.id.dialtacts_container, mDialpadFragment, TAG_DIALPAD_FRAGMENT);} else {  ft.show(mDialpadFragment);}




悬浮按钮控制器,管理悬浮按钮事件

private FloatingActionButtonController mFloatingActionButtonController;

final View floatingActionButtonContainer = findViewById(R.id.floating_action_button_container);ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);floatingActionButton.setOnClickListener(this);mFloatingActionButtonController = new FloatingActionButtonController(this,floatingActionButtonContainer, floatingActionButton);


主界面容器ListsFragment mListsFragment;

自定义的TAB分页控件ViewPagerTabs extends HorizontalScrollView

嵌套三个子fragment:快速拨号,通话记录,联系人

private SpeedDialFragment mSpeedDialFragment;private CallLogFragment mRecentsFragment;private AllContactsFragment mAllContactsFragment;


主界面的框架大致如此,各个fragment切换逻辑以及动效细节大家跟踪代码实现细看就明白了

时间不走啊了,今天的课程到此为止

github下载链接:https://github.com/geniusgithub/AndroidDialer

欲知后事如何,且听蓝老师下回分解

more brilliant,Please pay attention to my cnblog -->http://www.cnblogs.com/lance2016/

时间: 2024-08-28 11:41:36

android M拨号盘开源之旅(二)--- 浅析拨号盘主界面的相关文章

(NO.00004)iOS实现打砖块游戏(二):实现游戏主界面动画

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个内容不错的游戏也要一个好的包装.玩家进入游戏时第一眼看到的是将是游戏的主界面,如何生动的展示一个具有吸引力的界面就是本篇的主题.当然这里无法和商业游戏的主界面相比的,只是展示一下不用写什么代码,也可以把主界面做的比较活泼. 在主界面上添加静态元素 打开SpriteBuilder中的MainScene.ccb文件,将原有控件统统删掉,这时场景变得黑漆漆的一片.

Android实例-手机安全卫士(十五)-由主界面进入手机防盗界面

一.目标 1.在主界面中通过“设置防盗密码”或者“输入防盗密码”后,对话框消失,并进入”手机防盗界面“. 2.进入是”手机防盗界面“时,根据有无完成”手机防盗设置向导“的情况进入不同的界面.若未完成,则进入向导界面,若已完成,则进入防盗界面.          二.代码实现. 1.在程序包(com.example.mobilesafe)下新建两个Activity(分别取名SecurityActivity和SetupWizard),并在配置文件(AndroidManifest.xml)中完成注册.

android M拨号盘开源之旅(一)--- 初窥M拨号盘

2015年5月28日,Google I/O大会上正式推出Android M 全新的Android M相比目前的Android Lollipop(5.0)有六项重大的改进: 1.App Permissions(软件权限管理):在Android M里,应用许可提示可以自定义了. 2.Chrome Custom Tabs(网页体验提升):新版的M对于Chrome的网页浏览体验进行了提升,它对登陆网站.存储密码.自动补全资料.多线程浏览网页的安全性进行了一些列的优化. 3.App Links(APP关联

android版微信5.3安装目录分析及主界面高仿

一.安装目录分析 最近在做手机项目时,涉及很多本地文件管理方面的内容,比如用户的头像.下载的图片.视频等等,将这些文件缓存在本地,必须设计一个合理的组织方式,这样才能便于管理和后面的扩展及维护.这期间先后看了微视和美拍的本地文件组织方式,基本属于大家都在采用的方式,即一个大的cache文件夹,然后里面是按照类别划分的子文件夹,分别存放图片.视频等.随后又看了一下微信的组织方式,觉得微信的组织方式有点意思.同时也产生了几个疑问,到现在也没闹明白. 微信的安装目录位于Tencent文件夹内,该文件夹

【Android】10.1 扩展组件库和其他视图--本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-18 1.主界面运行截图 2.MainActivity.cs文件中对应的代码 chItems.Add(new Chapter() { ChapterName = "第10章 扩展组件库和其他视图", ChapterItems = new ChItem[] { new ChItem { type=typeof(ch1001Main), Title="例10-1 网格视图基本用法", Desc = &

【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源热更新 Android热更新开源项目Tinker源码解析系类之三:so热更新 转载请标明本文来源:http://www.cnblogs

Android(Xamarin)之旅(二)

原文:Android(Xamarin)之旅(二) 新的一年,新的开始,2016,我要做什么,大家要做什么,啦啦啦. OK,上篇已经介绍了几个简单的控件,这次,我们继续说说控件.但是可能有人认为这有什么难的,问题不在这里,而在于,如果你注意了每一个空间,或者你就会发现,在很多的应用里面,很多的玩意都是直接用的控件. 一.Visual Studio 工具箱布局 1.Other Widgets 这里就一个Switch,其实也就是一个开关布局 2.Images & Media 这里面的有ImageBut

Android 4.4 Kitkat Phone工作流程浅析(十二)__4.4小结与5.0概览

前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析> <Android 4.4 Kitkat Phone工作流程浅析(四)__RILJ工作流程简析> <Android 4.4 Kitkat Phone工作流程浅析(五)__M

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1