Android官方文档—User Interface(Search)(Adding Custom Suggestions)

添加自定义建议

使用Android搜索对话框或搜索小组件时,您可以提供根据应用程序中的数据创建的自定义搜索建议。例如,如果您的应用程序是单词词典,则可以建议词典中与目前为止输入的文本匹配的单词。这些是最有价值的建议,因为您可以有效地预测用户想要的内容并提供对其的即时访问。图1显示了带有自定义建议的搜索对话框的示例。

提供自定义建议后,您还可以将其提供给系统范围的快速搜索框,以便从应用程序外部访问您的内容。

在开始本指南添加自定义建议之前,您需要在应用程序中实现Android搜索对话框或搜索小部件以进行搜索。如果还没有,请参阅创建搜索界面。

基础


当用户选择自定义建议时,Android系统会向您的可搜索活动发送Intent。普通搜索查询使用ACTION_SEARCH操作发送意图,而您可以定义自定义建议以使用ACTION_VIEW(或任何其他意图操作),还包括与所选建议相关的数据。继续字典示例,当用户选择建议时,您的应用程序可以立即打开该单词的定义,而不是在字典中搜索匹配项。

图1.包含自定义搜索建议的搜索对话框
的屏幕截图。

要提供自定义建议,请执行以下操作:

  • 实现基本的可搜索活动,如创建搜索界面中所述。
  • 使用有关提供自定义建议的内容提供商的信息修改可搜索配置。
  • 构建一个表(例如在SQLiteDatabase中)以获取建议并使用必需的列格式化表。
  • 创建一个可以访问您的建议表的内容提供者,并在清单中声明提供者。
  • 声明当用户选择建议(包括自定义操作和自定义数据)时要发送的Intent类型。

就像Android系统显示搜索对话框一样,它也会显示您的搜索建议。您所需要的只是一个内容提供商,系统可以从中检索您的建议。如果您不熟悉创建内容提供程序,请在继续之前阅读Content Providers开发人员指南。

当系统识别出您的活动是可搜索的并提供搜索建议时,在用户键入查询时会发生以下过​​程:

1.系统获取搜索查询文本(到目前为止已输入的任何内容),并对管理您的建议的内容提供商执行查询。

2.您的内容提供商返回一个Cursor,指向与搜索查询文本相关的所有建议。

3.系统显示Cursor提供的建议列表。

显示自定义建议后,可能会发生以下情况:

  • 如果用户键入另一个键,或以任何方式更改查询,则重复上述步骤并根据需要更新建议列表。
  • 如果用户执行搜索,则会忽略建议,并使用正常的ACTION_SEARCH目标将搜索传递到您的可搜索活动。
  • 如果用户选择了建议,则会向您的可搜索活动发送意图,其中包含自定义操作和自定义数据,以便您的应用程序可以打开建议的内容。

修改可搜索的配置


要添加对自定义建议的支持,请将android:searchSuggestAuthority属性添加到可搜索配置文件中的<searchable>元素。例如:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider">
</searchable>

您可能需要一些其他属性,具体取决于您附加到每个建议的意图类型以及您希望如何格式化查询到内容提供商。其他可选属性将在以下部分中讨论。

创建内容提供商


为自定义建议创建内容提供程序需要有关内容提供程序开发人员指南中涵盖的内容提供程序的先前知识。在大多数情况下,自定义建议的内容提供商与任何其他内容提供商相同。但是,对于您提供的每个建议,Cursor中的相应行必须包含系统理解并用于格式化建议的特定列。

当用户开始在搜索对话框或搜索小部件中键入内容时,系统会在每次输入字母时通过调用query()来查询内容提供商以获取建议。在您的query()实现中,您的内容提供者必须搜索您的建议数据并返回指向您已确定为好建议的行的Cursor。

有关为自定义建议创建内容提供程序的详细信息,请参阅以下两节:

Handling the suggestion query

系统如何向您的内容提供商发送请求以及如何处理它们

Building a suggestion table

如何定义每个查询返回的Cursor中系统所需的列

处理建议查询

当系统向您的内容提供商请求建议时,它会调用您的内容提供商的query()方法。您必须实现此方法来搜索建议数据并返回指向您认为相关的建议的Cursor。

以下是系统传递给query()方法的参数摘要(按顺序列出):

uri

始终是内容Uri,格式为:

content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY

系统默认行为是传递此URI并将其与查询文本一起附加。例如:

content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY/puppies

最后的查询文本使用URI编码规则进行编码,因此您可能需要在执行搜索之前对其进行解码。

如果您在可搜索的配置文件中使用android:searchSuggestPath属性设置了这样的路径,则optional.suggest.path部分仅包含在URI中。仅当您为多个可搜索活动使用相同的内容提供程序时才需要这样做,在这种情况下,您需要消除建议查询的来源歧义。

注意:SUGGEST_URI_PATH_QUERY不是URI中提供的文字字符串,而是在需要引用此路径时应使用的常量。

projection

始终为空

selection

您的可搜索配置文件的android:searchSuggestSelection属性中提供的值,如果尚未声明android:searchSuggestSelection属性,则为null。有关使用它来获取以下查询的更多信息。

selectionArgs

如果已在可搜索配置中声明了android:searchSuggestSelection属性,则将搜索查询包含为数组的第一个(也是唯一的)元素。如果尚未声明android:searchSuggestSelection,则此参数为null。有关使用它来获取以下查询的更多信息。

sortOrder

始终为空

系统可以通过两种方式向您发送搜索查询文本。默认方式是将查询文本包含为uri参数中传递的内容URI的最后一个路径。但是,如果在可搜索配置的android:searchSuggestSelection属性中包含选择值,则查询文本将作为selectionArgs字符串数组的第一个元素传递。接下来总结两种选择。

在Uri中获取查询

默认情况下,查询将作为uri参数的最后一个段(Uri对象)附加。要在这种情况下检索查询文本,只需使用getLastPathSegment()。例如:

String query = uri.getLastPathSegment().toLowerCase();

这将返回Uri的最后一段,即用户输入的查询文本。

在选择参数中获取查询

您可能认为查询()方法接收执行查找所需的所有内容并且您希望selection和selectionArgs参数带有适当的值,而不是使用URI。在这种情况下,使用您的SQLite选择字符串将android:searchSuggestSelection属性添加到您的可搜索配置中。在选择字符串中,包含一个问号(“?”)作为实际搜索查询的占位符。系统调用query(),选择字符串作为选择参数,搜索查询作为selectionArgs数组中的第一个元素。

例如,以下是如何构建android:searchSuggestSelection属性以创建全文搜索语句:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestSelection="word MATCH ?">
</searchable>

使用此配置,您的query()方法将选择参数作为“单词匹配?”提供。和selectionArgs参数作为搜索查询。当您将这些传递给SQLite query()方法时,作为它们各自的参数,它们被合成在一起(问号被查询文本替换)。如果您选择以这种方式接收建议查询并需要在查询文本中添加通配符,请将它们附加(和/或前缀)到selectionArgs参数,因为此值包含在引号中并插入代替问号。

上例中的另一个新属性是android:searchSuggestIntentAction,它定义了当用户选择建议时随每个意图发送的意图动作。有关声明建议意图的部分将进一步讨论。

提示:如果您不想在android:searchSuggestSelection属性中定义选择子句,但仍希望在selectionArgs参数中接收查询文本,只需为android:searchSuggestSelection属性提供非null值。这会触发在selectionArgs中传递的查询,您可以忽略选择参数。通过这种方式,您可以在较低级别定义实际选择子句,以便您的内容提供者不必处理它。

建立一个建议表

当您使用Cursor向系统返回建议时,系统需要每行中的特定列。因此,无论您是否决定将建议数据存储在设备上的SQLite数据库,Web服务器上的数据库或设备或Web上的其他格式中,您都必须将建议格式化为表格中的行并将其显示为一个光标。系统了解多个列,但只需要两个:

创建没有表的游标

如果您的搜索建议未使用系统所需的列以表格格式(例如SQLite表格)存储,则可以在建议数据中搜索匹配项,然后将其格式化为每个请求的必要表格。为此,请使用所需的列名创建MatrixCursor,然后使用addRow(Object [])为每个建议添加一行。从Content Provider的query()方法返回最终产品。

_ID

每个建议的唯一整数行ID。系统需要这样才能在ListView中显示建议。

SUGGEST_COLUMN_TEXT_1

作为建议呈现的字符串。

以下列都是可选的(大多数将在以下部分中进一步讨论):

SUGGEST_COLUMN_TEXT_2

一个字符串。如果您的Cursor包含此列,则所有建议都以两行格式提供。此列中的字符串显示为主要建议文本下方的第二个较小的文本行。它可以为null或空,表示没有辅助文本。

SUGGEST_COLUMN_ICON_1

可绘制资源,内容或文件URI字符串。如果您的Cursor包含此列,则所有建议都以图标加文本格式提供,左侧是可绘制图标。这可以为null或零,表示此行中没有图标。

SUGGEST_COLUMN_ICON_2

可绘制资源,内容或文件URI字符串。如果您的Cursor包含此列,则所有建议都以图标加文本格式提供,右侧带有图标。这可以为null或零,表示此行中没有图标。

SUGGEST_COLUMN_INTENT_ACTION

意图操作字符串。如果此列存在且包含给定行的值,则在形成建议的意图时将使用此处定义的操作。如果未提供该元素,则会从您的可搜索配置中的android:searchSuggestIntentAction字段中获取操作。如果您对所有建议的操作相同,则使用android:searchSuggestIntentAction指定操作会更有效,并省略此列。

SUGGEST_COLUMN_INTENT_DATA

数据URI字符串。如果此列存在且包含给定行的值,则这是在形成建议意图时使用的数据。如果未提供该元素,则数据将从您的可搜索配置中的android:searchSuggestIntentData字段中获取。如果未提供任何源,则intent的数据字段为null。如果您的数据对于所有建议都相同,或者可以使用常量部分和特定ID来描述,则使用android:searchSuggestIntentData指定它并且省略此列更有效。

SUGGEST_COLUMN_INTENT_DATA_ID

URI路径字符串。如果此列存在且包含给定行的值,则“/”将此值附加到intent中的数据字段。只有在可搜索配置中由android:searchSuggestIntentData属性指定的数据字段已设置为适当的基本字符串时,才应使用此选项。

SUGGEST_COLUMN_INTENT_EXTRA_DATA

任意数据。如果此列存在且包含给定行的值,则这是在形成建议意图时使用的额外数据。如果未提供,则intent的额外数据字段为null。此列允许建议提供附加数据,这些数据作为intent的EXTRA_DATA_KEY键中的额外数据包含在内。

SUGGEST_COLUMN_QUERY

如果此列存在并且此元素存在于给定行,则这是在形成建议的查询时使用的数据,在intent的QUERY键中作为额外包含。如果建议的操作是ACTION_SEARCH,则是必需的,否则是可选的。

SUGGEST_COLUMN_SHORTCUT_ID

仅在为快速搜索框提供建议时使用。此列指示是否应将搜索建议存储为快捷方式以及是否应对其进行验证。当用户单击快速搜索框中的建议时,通常会形成快捷方式。如果缺少,结果将存储为快捷方式,并且永远不会刷新。如果设置为SUGGEST_NEVER_MAKE_SHORTCUT,则结果不会存储为快捷方式。否则,快捷方式ID用于使用SUGGEST_URI_PATH_SHORTCUT检查最新建议。

SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING

仅在为快速搜索框提供建议时使用。此列指定在快速搜索框中刷新此建议的快捷方式时,应显示微调器而不是SUGGEST_COLUMN_ICON_2中的图标。

以下各节将更详细地讨论其中一些列。

声明建议意图


当用户从搜索对话框或窗口小部件下方显示的列表中选择建议时,系统会向您的可搜索活动发送自定义意图。您必须定义intent的操作和数据。

声明意图行动

自定义建议最常见的意图操作是ACTION_VIEW,当您想要打开某些内容时,它是合适的,例如单词的定义,人物的联系信息或网页。但是,意图动作可以是任何其他动作,甚至可以对每个建议不同。

根据您是否希望所有建议都使用相同的意图操作,您可以通过两种方式定义操作:

2.使用可搜索配置文件的android:searchSuggestIntentAction属性来定义所有建议的操作。

例如:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.Intent.action.VIEW" >
</searchable>

b.使用SUGGEST_COLUMN_INTENT_ACTION列定义各个建议的操作。

将SUGGEST_COLUMN_INTENT_ACTION列添加到您的建议表中,并为每个建议添加要使用的操作(例如“android.Intent.action.VIEW”)。

您也可以将这两种技术结合起来。例如,您可以包含android:searchSuggestIntentAction属性以及默认情况下与所有建议一起使用的操作,然后通过在SUGGEST_COLUMN_INTENT_ACTION列中声明不同的操作来覆盖此操作以获取某些建议。如果未在SUGGEST_COLUMN_INTENT_ACTION列中包含值,则使用android:searchSuggestIntentAction属性中提供的intent。

注意:如果在可搜索配置中未包含android:searchSuggestIntentAction属性,则必须在SUGGEST_COLUMN_INTENT_ACTION列中为每个建议添加一个值,否则意图将失败。

声明意图数据

当用户选择建议时,您的可搜索活动会收到您已定义的操作的意图(如上一节所述),但意图也必须携带数据,以便您的活动识别选择了哪个建议。具体来说,数据应该是每个建议的唯一内容,例如SQLite表中建议的行ID。收到intent后,您可以使用getData()或getDataString()检索附加数据。

您可以通过两种方式定义意图中包含的数据:

a.在建议表的SUGGEST_COLUMN_INTENT_DATA列中定义每个建议的数据。

通过包含SUGGEST_COLUMN_INTENT_DATA列,然后使用每行的唯一数据填充它,为建议表中的每个intent提供所有必要的数据信息。此列中的数据与您在此列中定义的内容完全相同。然后,您可以使用getData()或getDataString()来检索它。

提示:通常最简单的方法是将表的行ID用作Intent数据,因为它始终是唯一的。最简单的方法是使用SUGGEST_COLUMN_INTENT_DATA列名作为行ID列的别名。有关SQLiteQueryBuilder创建列名称到别名的投影映射的示例,请参阅Searchable Dictionary示例应用程序。

b.将数据URI分段为两部分:所有建议共有的部分和每个建议的唯一部分。将这些部分分别放入可搜索配置的android:searchSuggestintentData属性和建议表的SUGGEST_COLUMN_INTENT_DATA_ID列中。

声明可搜索配置的android:searchSuggestIntentData属性中所有建议共有的URI片段。例如:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestIntentData="content://com.example/datatable" >
</searchable>

然后在建议表的SUGGEST_COLUMN_INTENT_DATA_ID列中包含每个建议的最终路径(唯一部分)。当用户选择建议时,系统从android:searchSuggestIntentData获取字符串,附加斜杠(“/”),然后从SUGGEST_COLUMN_INTENT_DATA_ID列添加相应的值以形成完整的内容URI。然后,您可以使用getData()检索Uri。

添加更多数据

如果您需要根据自己的意图表达更多信息,可以添加另一个表格列SUGGEST_COLUMN_INTENT_EXTRA_DATA,该列可以存储有关该建议的其他信息。保存在此列中的数据放在intent的额外Bundle的EXTRA_DATA_KEY中。

处理意图


现在您使用自定义意图提供自定义搜索建议,当用户选择建议时,您需要可搜索的活动来处理这些意图。这是处理您的可搜索活动已经执行的ACTION_SEARCH目的的补充。以下是您在活动onCreate()回调期间如何处理意图的示例:

Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    // Handle the normal search query case
    String query = intent.getStringExtra(SearchManager.QUERY);
    doSearch(query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
    // Handle a suggestions click (because the suggestions all use ACTION_VIEW)
    Uri data = intent.getData();
    showResult(data);
}

在此示例中,intent操作是ACTION_VIEW,数据带有指向建议项的完整URI,由android:searchSuggestIntentData字符串和SUGGEST_COLUMN_INTENT_DATA_ID列合成。然后将URI传递给本地showResult()方法,该方法向内容提供程序查询URI指定的项目。

注意:您不需要为Android清单文件添加意图过滤器,以用于使用android:searchSuggestIntentAction属性或SUGGEST_COLUMN_INTENT_ACTION列定义的intent操作。系统按名称打开您的可搜索活动以提供建议的意图,因此活动不需要声明已接受的操作。

重写查询文本


如果用户使用方向控件(例如使用轨迹球或d-pad)浏览建议列表,则默认情况下查询文本不会更新。但是,您可以临时重写用户的查询文本,因为它显示在文本框中,其查询与当前焦点的建议相匹配。这使用户能够查看正在建议的查询(如果适用),然后选择搜索框并编辑查询,然后再将其作为搜索发送。

您可以通过以下方式重写查询文本:

a.使用“queryRewriteFromText”值将android:searchMode属性添加到您的可搜索配置中。在这种情况下,来自建议的SUGGEST_COLUMN_TEXT_1列的内容用于重写查询文本。

b.使用“queryRewriteFromData”值将android:searchMode属性添加到您的可搜索配置中。在这种情况下,建议的SUGGEST_COLUMN_INTENT_DATA列中的内容用于重写查询文本。这应仅用于URI或其他旨在用户可见的数据格式,例如HTTP URL。不应使用内部URI方案以这种方式重写查询。

c.在建议表的SUGGEST_COLUMN_QUERY列中提供唯一的查询文本字符串。如果此列存在并包含当前建议的值,则它用于重写查询文本(并覆盖以前的任一实现)。

将搜索建议公开给快速搜索框


一旦您配置应用程序以提供自定义搜索建议,将它们提供给全局可访问的快速搜索框就像修改您的可搜索配置一样简单,将android:includeInGlobalSearch包含为“true”。

唯一需要执行其他工作的方案是您的内容提供商要求读取权限。在这种情况下,您需要为提供程序添加一个特殊的<path-permission>元素,以授予对内容提供程序的快速搜索框读取权限。例如:

<provider android:name="MySuggestionProvider"
          android:authorities="com.example.MyCustomSuggestionProvider"
          android:readPermission="com.example.provider.READ_MY_DATA"
          android:writePermission="com.example.provider.WRITE_MY_DATA">
  <path-permission android:pathPrefix="/search_suggest_query"
                   android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>

在此示例中,提供程序限制对内容的读写访问。当存在“android.permission.GLOBAL_SEARCH”权限时,<path-permission>元素通过授予对“/ search_suggest_query”路径前缀内的内容的读访问权来修改限制。这将授予对快速搜索框的访问权限,以便它可以向您的内容提供商查询建议。

如果您的内容提供商未强制执行读取权限,则快速搜索框可以默认读取它。

在设备上启用建议

当您的应用程序配置为在快速搜索框中提供建议时,默认情况下,它实际上无法在快速搜索框中提供建议。用户可以选择是否在快速搜索框中包含应用程序中的建议。要从您的应用程序启用搜索建议,用户必须打开“可搜索项目”(在“设置”>“搜索”中),并将您的应用程序作为可搜索项目启用。

快速搜索框可用的每个应用程序在“可搜索项目设置”页面中都有一个条目。该条目包括应用程序的名称以及可以从应用程序中搜索的内容的简短描述,并可在快速搜索框中提供建议。要为可搜索的应用程序定义描述文本,请将android:searchSettingsDescription属性添加到可搜索的配置中。例如:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MyCustomSuggestionProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:includeInGlobalSearch="true"
    android:searchSettingsDescription="@string/search_description" >
</searchable>

android:searchSettingsDescription的字符串应尽可能简洁,并说明可搜索的内容。例如,音乐应用程序的“艺术家,专辑和曲目”,或记事本应用程序的“已保存的音符”。提供该描述很重要,因此用户知道提供了什么类型的建议。当android:includeInGlobalSearch为“true”时,您应该始终包含此属性。

请记住,在快速搜索框中显示搜索建议之前,用户必须访问设置菜单以启用应用程序的搜索建议。因此,如果搜索是您的应用程序的一个重要方面,那么您可能需要考虑一种方式将其传达给您的用户 - 您可能会在他们第一次启动应用程序时提供说明,指示他们如何为Quick启用搜索建议搜索框。

管理快速搜索框建议快捷方式

用户从快速搜索框中选择的建议可以自动转换为快捷方式。这些是系统从您的内容提供商复制的建议,因此它可以快速访问建议,而无需重新查询您的内容提供商。

默认情况下,为快速搜索框检索的所有建议启用此功能,但如果建议数据随时间变化,则可以请求刷新快捷方式。例如,如果您的建议涉及动态数据,例如联系人的在线状态,那么您应该在向用户显示时请求刷新建议快捷方式。为此,请在建议表中包含SUGGEST_COLUMN_SHORTCUT_ID。使用此列,您可以通过以下方式之一配置每个建议的快捷方式行为:

a.让快速搜索框重新查询您的内容提供商,以获得新版本的建议快捷方式。

在SUGGEST_COLUMN_SHORTCUT_ID列中提供值,并在每次显示快捷方式时重新查询新建版本的建议。在刷新查询返回之前,快捷方式会快速显示最近可用的任何数据,此时将使用新信息刷新建议。刷新查询将以URI路径SUGGEST_URI_PATH_SHORTCUT(而不是SUGGEST_URI_PATH_QUERY)发送到您的内容提供商。

您返回的光标应包含一个使用与原始建议相同的列的建议,或者为空,表示该快捷方式不再有效(在这种情况下,建议消失并删除快捷方式)。

如果一个建议是指可能需要更长的时间来刷新,如基于网络的更新数据,你也可以在SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING柱,以“真”的值,以显示右手进度微调添加到您的建议表图标,直到刷新完成。除“true”以外的任何值都不会显示进度微调器。

b.防止将建议复制到快捷方式中。

在SUGGEST_COLUMN_SHORTCUT_ID列中提供SUGGEST_NEVER_MAKE_SHORTCUT的值。在这种情况下,建议永远不会复制到快捷方式中。只有在您绝对不希望出现以前复制的建议时才应该这样做。 (回想一下,如果为列提供正常值,则建议快捷方式仅在刷新查询返回之前出现。)

c.允许应用默认快捷方式行为。

对于每个不会更改的建议,请将SUGGEST_COLUMN_SHORTCUT_ID保留为空,并将其保存为快捷方式。

如果您的建议都没有改变,那么您根本不需要SUGGEST_COLUMN_SHORTCUT_ID列。

注意:快速搜索框最终决定是否为建议创建快捷方式,将这些值视为应用程序的强烈请求 - 无法保证您为建议快捷方式请求的行为将受到尊重。

关于快速搜索框建议排名

将应用程序的搜索建议提供给快速搜索框后,快速搜索框排名将确定如何针对特定查询向用户显示建议。这可能取决于有多少其他应用有该查询的结果,以及用户选择结果与其他应用相比的频率。无法保证您的建议的排名方式,也不保证您的应用建议是否针对特定查询显示。一般而言,您可以预期提供高质量的结果会增加您的应用建议在显着位置提供的可能性,而提供低质量建议的应用更有可能排名较低或未显示。

有关自定义搜索建议的完整演示,请参阅Searchable Dictionary示例应用程序。

 

First Edition Build Android Apps That Are Stunningly Attractive, Functional, and Intuitive In today’s crowded Android marketplace, it’s more important than ever to differentiate your apps. Great design is the best way to do that. Now, leading Android app design expert Ian G. Clifton shows you how to make your apps come alive and how to deliver apps that users will want, love, and buy! Reflecting the Android 4.2 SDK, this book serves both as a tutorial for the entire design and implementation process and as a handy reference you’ll rely on for every Android development project. Clifton shows how to create effective designs, organize them into Android components, and move gracefully from idea, to wireframe, to comp, to finished app. You’ll learn how to bring your own voice, personality, and style to your app designs; how to leverage advanced drawing techniques such as PorterDuff compositing; how to test designs on diverse Android devices; and much more. Android User Interface Design details each step of the design and development process and contains extensive downloadable sample code, including complete finished apps. Learn how Android has evolved to support outstanding app design Integrate app design with development, from idea through deployment Understand views, the building blocks of Android user interfaces Make the most of wireframes and prototypes Build efficient layouts and integrate smooth animations Make apps more useful by automatically updating ListViews Combine views into custom components Use image compositing and other advanced techniques Work with the canvas and advanced drawing Leverage Google Play and Amazon Appstore assets One step at a time, this guide helps you bridge the gap between Android developers and designers so you can work with colleagues to create world-class app designs...or do it yourself!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值