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
中的示例,它确实包含一些名称包含&#34; preference&#34;的资源。
例如,文件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_width="wrap_content"
android:layout_height="wrap_content"
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提供的布局,保留TextView
的标题和摘要,只需在XML中标注的位置添加自己的小部件,标识为@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_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingStart="16dip"
android:paddingEnd="?android:attr/scrollbarSize">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/preference_widget_width"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:layout_weight="1">
<TextView android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee"
android:fadingEdge="horizontal" />
<TextView android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/preference_widget_width"
android:gravity="center"
android:orientation="vertical" />
</LinearLayout>
答案 0 :(得分:0)
您可以通过编程方式执行此操作。首先,您需要获取Activity的rootView,请参阅此处https://stackoverflow.com/a/4488149/2895571。然后你可以在rootView上尝试findViewById()
。