相关源码:
\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\CollapsedStatusBarFragment.java

在文章《Android P SystemUI之super_status_bar.xml解析》讲到,StatusBar的UI主要是在super_status_bar.xml中加载的,其中状态栏UI部分主要容器status_bar_container中。

super_status_bar.xml的状态栏UI部分:

 <FrameLayout     android:id="@+id/status_bar_container"     android:layout_width="match_parent"     android:layout_height="wrap_content" />

在StatusBar.java中初始化状态栏的UI:

// ================================================================================// Constructing the view// ================================================================================protected void makeStatusBarView() {//省略一部分代码//...       FragmentHostManager.get(mStatusBarWindow)               .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {                   CollapsedStatusBarFragment statusBarFragment =                           (CollapsedStatusBarFragment) fragment;                   statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);                   PhoneStatusBarView oldStatusBarView = mStatusBarView;                   mStatusBarView = (PhoneStatusBarView) fragment.getView();                   mStatusBarView.setBar(this);                   mStatusBarView.setPanel(mNotificationPanel);                   mStatusBarView.setScrimController(mScrimController);                   mStatusBarView.setBouncerShowing(mBouncerShowing);                   if (oldStatusBarView != null) {                       float fraction = oldStatusBarView.getExpansionFraction();                       boolean expanded = oldStatusBarView.isExpanded();                       mStatusBarView.panelExpansionChanged(fraction, expanded);                   }                   if (mHeadsUpAppearanceController != null) {                       // This view is being recreated, let's destroy the old one                       mHeadsUpAppearanceController.destroy();                   }                   mHeadsUpAppearanceController = new HeadsUpAppearanceController(                           mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow);                   mStatusBarWindow.setStatusBarView(mStatusBarView);                   setAreThereNotifications();                   checkBarModes();               }).getFragmentManager()               .beginTransaction()               .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),                       CollapsedStatusBarFragment.TAG)               .commit();//省略一部分代码//...}

关键点:replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),CollapsedStatusBarFragment.TAG)

mStatusBarWindow就是加载了layout view super_status_bar.xml的窗口对象。

这里使用CollapsedStatusBarFragment来填充status_bar_container的view。

CollapsedStatusBarFragment.java

CollapsedStatusBarFragment中加载的UI正是R.layout.status_bar

@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,        Bundle savedInstanceState) {    return inflater.inflate(R.layout.status_bar, container, false);}

status_bar.xml

<!--    android:background="@drawable/status_bar_closed_default_background" --><com.android.systemui.statusbar.phone.PhoneStatusBarView    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"    android:layout_width="match_parent"    android:layout_height="@dimen/status_bar_height"    android:id="@+id/status_bar"    android:background="@drawable/system_bar_background"    android:orientation="vertical"    android:focusable="false"    android:descendantFocusability="afterDescendants"    android:accessibilityPaneTitle="@string/status_bar"    >    <ImageView        android:id="@+id/notification_lights_out"        android:layout_width="@dimen/status_bar_icon_size"        android:layout_height="match_parent"        android:paddingStart="@dimen/status_bar_padding_start"        android:paddingBottom="2dip"        android:src="@drawable/ic_sysbar_lights_out_dot_small"        android:scaleType="center"        android:visibility="gone"        />    <LinearLayout android:id="@+id/status_bar_contents"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:paddingStart="@dimen/status_bar_padding_start"        android:paddingEnd="@dimen/status_bar_padding_end"        android:orientation="horizontal"        >        <ViewStub            android:id="@+id/operator_name"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:layout="@layout/operator_name" />        <FrameLayout            android:layout_height="match_parent"            android:layout_width="0dp"            android:layout_weight="1">            <include layout="@layout/heads_up_status_bar_layout" />            <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the             individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and             DISABLE_NOTIFICATION_ICONS, respectively -->            <LinearLayout                android:id="@+id/status_bar_left_side"                android:layout_height="match_parent"                android:layout_width="match_parent"                android:clipChildren="false"            >                <com.android.systemui.statusbar.policy.Clock                    android:id="@+id/clock"                    android:layout_width="wrap_content"                    android:layout_height="match_parent"                    android:textAppearance="@style/TextAppearance.StatusBar.Clock"                    android:singleLine="true"                    android:paddingStart="@dimen/status_bar_left_clock_starting_padding"                    android:paddingEnd="@dimen/status_bar_left_clock_end_padding"                    android:gravity="center_vertical|start"                />                <com.android.systemui.statusbar.AlphaOptimizedFrameLayout                    android:id="@+id/notification_icon_area"                    android:layout_width="0dp"                    android:layout_height="match_parent"                    android:layout_weight="1"                    android:orientation="horizontal"                    android:clipChildren="false"/>            </LinearLayout>        </FrameLayout>        <!-- Space should cover the notch (if it exists) and let other views lay out around it -->        <android.widget.Space            android:id="@+id/cutout_space_view"            android:layout_width="0dp"            android:layout_height="match_parent"            android:gravity="center_horizontal|center_vertical"        />        <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:orientation="horizontal"            android:gravity="center_vertical|end"            >            <include layout="@layout/system_icons" />        </com.android.keyguard.AlphaOptimizedLinearLayout>    </LinearLayout>    <ViewStub        android:id="@+id/emergency_cryptkeeper_text"        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:layout="@layout/emergency_cryptkeeper_text"    /></com.android.systemui.statusbar.phone.PhoneStatusBarView>

status_bar.xml的组成部分:
1、ImageView,id="@+id/notification_lights_out",低辨识度模式,flag是SYSTEM_UI_FLAG_LOW_PROFILE,进入进入低辨识度模式只显示这个imageView,为一个灰色小圆点,一般不可见。

status_bar_contents,状态栏的主Content,包括状态栏的全部图标,主要包括:
2、ViewStub,id="@+id/operator_name",包含了operator_name.xml,主要显示运营商名称
3、layout,heads_up_status_bar_layout,包含了一个heads_up_status_bar_layout.xml,主要显示heads_up信息,是一个提示信息,主要显示在状态栏下方,类似一个弹框的显示,用于提示信息。
4、 LinearLayout,status_bar_left_side,左边显示区域,时钟区域和notification_icon_area,一是显示时钟Clock,二是显示通知icon。
5、Space,id="@+id/cutout_space_view",空view,位于状态来中间位置。用于视图布局,不显示实际内容。
6、LinearLayout,id="@+id/system_icon_area",系统图标区域,主要包括蓝牙,wifi,4G信号等图标显示。这里加载了,system_icons.xml中去完成这些图标
7、ViewStub,:d="@+id/emergency_cryptkeeper_text",加载了emergency_cryptkeeper_text.xml,用于显示紧急电话文字。

需要注意的是,android 9.0系统中没有去使用signal_cluster_view加载信号变化图标显示。

signal_cluster_view是android 9.0之前的版本中使用到的。

更多相关文章

  1. Android--SoLoader,android动态加载so库
  2. android 创建桌面快捷方式 、插件
  3. android用户界面-组件Widget-地图视图MapView
  4. Android中使Dialog显示时背景不变暗
  5. Android异步加载图像小结 (含线程池,缓存方法)
  6. Android(安卓)Paging组件Demo
  7. Android(安卓)TabHost使用、动态加载内容
  8. 在android中policymanager
  9. Android(安卓)屏幕设置

随机推荐

  1. 关于menu
  2. 在Android(安卓)2.3中如何使用native_act
  3. Android(安卓)仿联系人菜单,带字母索引,顶
  4. Android(安卓)Material Design控件学习(二
  5. Android入门笔记 - 数据存储 - SharedPre
  6. 利用Hierarchy Viewer优化布局
  7. Android解决设置(background)属性的时候图
  8. android 物理键盘布局
  9. Android(安卓)开发有用代码积累
  10. url android