在哪里以及如何找到 Android 类使用的布局文件?

Posted

技术标签:

【中文标题】在哪里以及如何找到 Android 类使用的布局文件?【英文标题】:Where and how can I find the layout files used by Android classes? 【发布时间】:2017-03-04 21:48:04 【问题描述】:

问题

android SDK 类使用资源 ID 引用预定义的布局。

在我的示例中,我正在创建一个自定义 Preference 类,并希望为该首选项类型创建一个自定义布局(包括自定义小部件)。这一切都很好,例如我可以让TextView 在 XML 中显示使用 android:title 指定的首选项标题(这是 no 自定义属性)。

问题是我希望我的自定义布局的样式符合标准 Android Preference 类使用的样式。这包括例如文本大小和样式。我可以简单地尝试一下以找到匹配的样式,但我怀疑 Android 使用的样式是通用的,因此它会适应应用程序的通用样式。

方法

我查看了 SDK 中的 Preference 类,发现对于标题,它执行以下操作:

TextView titleView = (TextView) view.findViewById(com.android.internal.R.id.title)

这暗示所有样式都在布局文件中定义。现在我的问题是:如何找到这个布局文件?我想知道这里使用的资源 id 是否足够,它看起来如此笼统,甚至可能用于多种用途(即除Preference 类之外的其他地方的标题)。是这样吗?

为了找到布局文件,我例如在<android-sdk>/platforms/android-24/data/res/layout 中查找,它确实包含一些名称包括“preference”的资源。

例如,文件preference_category.xml 如下所示:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    style="?android:attr/listSeparatorTextViewStyle"
    android:id="@+android:id/title"
/>

这里定义了title id。这是上面com.android.internal.R.id.title 所指的id吗?

我可以找到更多相关的布局文件,其中preference_child.xml 看起来很有希望:

<TextView android:id="@+android:id/title"
            android:layout_
            android:layout_
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

但我仍然必须猜测它是否是我要查找的文件。因此问题是:如何找到正确的布局文件? XML 文件中没有太多文档。 一般来说,如何找到 Android 框架中不同位置使用的布局文件?

一个相关问题 (Where can I find default AlertDialog layout xml file? ) 的答案表明我查看了 SDK 中的正确目录。但是,答案并不能说明一般情况下人们是如何找到正在寻找的布局的。

带有自定义Preference的具体案例

相关帖子:Android: Creating custom preference

在链接的答案中,作者建议(通过给定的代码)创建一个自己的标题TextView。我想知道是否可以重用Android提供的布局,保留TextViews作为标题和摘要,并在XML中注明的位置添加自己的小部件,id为@android:id/widget_frame。如果不复制它并在新的布局文件中调整它,这可能吗?来自 Android SDK 的完整文件 preference_child.xml 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- Layout for a visually child-like Preference in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_
    android:layout_
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingStart="16dip"
    android:paddingEnd="?android:attr/scrollbarSize">

    <LinearLayout
        android:layout_
        android:layout_
        android:minWidth="@dimen/preference_widget_width"
        android:gravity="center"
        android:orientation="horizontal">
        <ImageView
            android:id="@+android:id/icon"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            />
    </LinearLayout>

    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_marginEnd="6dip"
        android:layout_marginTop="6dip"
        android:layout_marginBottom="6dip"
        android:layout_weight="1">

        <TextView android:id="@+android:id/title"
            android:layout_
            android:layout_
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView android:id="@+android:id/summary"
            android:layout_
            android:layout_
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout android:id="@+android:id/widget_frame"
        android:layout_
        android:layout_
        android:minWidth="@dimen/preference_widget_width"
        android:gravity="center"
        android:orientation="vertical" />

</LinearLayout>

【问题讨论】:

【参考方案1】:

您可以通过编程方式进行。首先你需要获取Activity的rootView,看这里https://***.com/a/4488149/2895571。然后你可以尝试在那个 rootView 上findViewById()

【讨论】:

我不明白这是如何回答问题的。如果您的意思是可以使用虚拟小部件从以下位置获取值:这可能是一种方法,但在处理 XML 级别时,最好使用实际的 SDK XML 文件。 @user905686 据我所知,无法覆盖 xml 布局,因此如果想要修改它,应该以编程方式完成。只需要引用它并更改它的属性

以上是关于在哪里以及如何找到 Android 类使用的布局文件?的主要内容,如果未能解决你的问题,请参考以下文章

有效使用 try-catch 块以及我们应该在哪里找到它们?

如何将电子邮件链接添加到布局 xml,Android

_ViewStart.cshtml 布局文件在哪里以及如何链接?

我在哪里可以找到 android studio 中浮动操作按钮的图标? [复制]

我的设置活动的布局文件在哪里?

如何在android源码中找到PackageManager类的具体实现