编辑SystemUI布局XML

时间:2017-02-06 13:31:01

标签: android xml

我正在尝试修改我的SystemUI,以便蜂窝信号状态更像AOSP。我已经替换了必要的图像,但现在布局不对。

现在,它看起来像这样: enter image description here 在AOSP上,它看起来像这样: enter image description here

目标是让E图标和数据箭头实际上与信号条三角形重叠。

我在SystemUI APK中找到了正确的XML(/res/layout/mobile_signal_group.xml)。这是原作:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@id/mobile_slot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="@dimen/signal_cluster_padding"
  xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto">
    <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content">
        <ImageView android:id="@id/slot_no_sims" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/accessibility_no_sims" />
        <LinearLayout android:orientation="horizontal" android:id="@id/data_combo" android:layout_width="wrap_content" android:layout_height="wrap_content">
            <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content">
                <ImageView android:id="@id/data_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
                <ImageView android:id="@id/data_inout" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            </FrameLayout>
        </LinearLayout>
        <FrameLayout android:id="@id/mobile_combo" android:layout_width="wrap_content" android:layout_height="wrap_content">
            <ImageView android:id="@id/mobile_sim_icon" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneLightTheme" android:id="@id/mobile_signal" android:layout_width="wrap_content" android:layout_height="wrap_content" systemui:hasOverlappingRendering="false" />
            <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneDarkTheme" android:id="@id/mobile_signal_dark" android:layout_width="wrap_content" android:layout_height="wrap_content" android:alpha="0.0" systemui:hasOverlappingRendering="false" />
            <ImageView android:id="@id/mobile_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            <ImageView android:layout_gravity="end|bottom|center" android:id="@id/mobile_inout" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        </FrameLayout>
        <FrameLayout android:id="@id/mobile_combo_2stage" android:layout_width="wrap_content" android:layout_height="wrap_content">
            <ImageView android:layout_gravity="bottom|center" android:id="@id/data_signal" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            <ImageView android:id="@id/data_rat_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            <ImageView android:id="@id/voice_signal" android:layout_width="wrap_content" android:layout_height="wrap_content" />
            <ImageView android:id="@id/voice_rat_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        </FrameLayout>
    </LinearLayout>
</FrameLayout>

我修改了它@id/data_type@id/data_inout并将它们移到@id/mobile_sim_icon正下方:

<FrameLayout android:id="@id/mobile_combo" android:layout_width="wrap_content" android:layout_height="wrap_content">
    <ImageView android:id="@id/mobile_sim_icon" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <ImageView android:id="@id/data_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <ImageView android:id="@id/data_inout" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneLightTheme" android:id="@id/mobile_signal" android:layout_width="wrap_content" android:layout_height="wrap_content" systemui:hasOverlappingRendering="false" />
    <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneDarkTheme" android:id="@id/mobile_signal_dark" android:layout_width="wrap_content" android:layout_height="wrap_content" android:alpha="0.0" systemui:hasOverlappingRendering="false" />
    <ImageView android:id="@id/mobile_type" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <ImageView android:layout_gravity="end|bottom|center" android:id="@id/mobile_inout" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</FrameLayout>

(摘要代码段)

但是当我这样做并使用修改后的XML进行flash时,SystemUI进入崩溃启动循环。似乎我对XML所做的任何更改都会导致这种情况。我对此很陌生,所以也许我错过了一步。

到目前为止,我已经尝试过:

  • data-typedata-inout移至另一个FrameLayout
  • 将整个LinearLayout移动到FrameLayout
  • 围绕data_combo FrameLayout
  • 包裹mobile_combo LinearLayout

所有导致SystemUI卡在崩溃循环中。

还有什么我可以尝试的吗?

设备:

  • LG V20 T-Mobile(H918)
  • Android 7.0

1 个答案:

答案 0 :(得分:2)

正如所讨论的in the chat,当您在@id/data_type之外移动@id/data_inout@id/data_combo时,SystemUI会因NullPointerException而崩溃。这是因为findViewbyId()是针对R.id.data_combo调用的,因此正在寻找@id/data_combo的直接后代。

由于您无法访问Java源代码,因此一种解决方法是将@id/data_combo包裹在@id/mobile_combo左右,以便@id/data_type@id/data_inout保持为@id/data_combo的直接后代。 <LinearLayout android:id="@id/data_combo" ... > <FrameLayout android:id="@id/mobile_combo" ... > ... </FrameLayout> </LinearLayout> 。例如:

const arr = [{ id: 1, foo: 'bar' }, { id: 2 }]
arr.map(o => o.foo && true).includes(true)
// true