3

我正在使用Android Support Library AppCompat我的应用程序,并尝试添加Search Widget到我的视图中。首先,我遇到了一个非常令人沮丧的错误,即搜索小部件没有出现在屏幕上。这是菜单 xml 文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_example"
        android:title="@string/action_example"
        app:showAsAction="withText|ifRoom" />

    <item android:id="@+id/search_bar"
        android:title="@string/search_title"
        android:icon="@drawable/ic_menu_search"
        android:showAsAction="always" (LINE ONE)
        android:actionViewClass="android.support.v7.widget.SearchView"/> (LINE TWO)
</menu>

数小时后进行调试。我注意到错误并更改为以下 xml 文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_example"
        android:title="@string/action_example"
        app:showAsAction="withText|ifRoom" />

    <item android:id="@+id/search_bar"
        android:title="@string/search_title"
        android:icon="@drawable/ic_menu_search"
        app:showAsAction="always"  (LINE ONE)
        app:actionViewClass="android.support.v7.widget.SearchView"/> (LINE TWO)
</menu>

正如您注意到的那样,在LINE ONELINE TWO我更改androidapp. 这很神奇。但是,我不知道那两条线背后有什么区别。当我们声明时有什么区别和意义:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

我有谷歌,但没有帖子与我的问题和疑问有关。

谢谢 :)

4

3 回答 3

4

您使用自己的自定义命名空间“app”,因为旧 android 版本的 android 框架中不存在属性“showasaction”。因此,当您使用动作兼容库时,您需要为该属性声明自己的命名空间。

来自开发者文档

使用支持库中的 XML 属性 请注意,上面的 showAsAction 属性使用了标记中定义的自定义命名空间。这在使用支持库定义的任何 XML 属性时是必需的,因为这些属性在旧设备上的 Android 框架中不存在。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。如果您的菜单项同时提供标题和图标(带有标题和图标属性),则默认情况下操作项仅显示图标。如果要显示文本标题,请将“withText”添加到 showAsAction 属性。例如:

http://developer.android.com/guide/topics/ui/actionbar.html

于 2013-10-28T16:26:37.157 回答
1

看起来 AppCompat 将这些 XML 标记声明为自定义元素。这是一个关于自定义元素的 Q/A,可能它更清楚:Declaring a custom android UI element using XML

于 2013-10-28T16:16:11.877 回答
1
  1. 首先,发生这种情况是因为您尝试使用为自定义视图定义的自定义视图自定义android.support.v7.widget.SearchView属性

例子:

app:showAsAction="always", 
app:actionViewClass="android.support.v7.widget.SearchView" 
  1. 当我们使用 android 默认属性时android:layout_width="match_parent"android:layout_height="wrap_content"它不会给出错误,因为我们已经为它定义xmlnsxmlns:android="http://schemas.android.com/apk/res/android"
  2. 因此,如果我们尝试使用自定义视图自定义属性,那么我们必须为此定义 xmlns。
  3. 在您的情况下,我看到您为SearchView xmlns:app="http://schemas.android.com/apk/res-auto"定义了这种方式 xmlns很好,有一种方法,另一种方法是xmlns:app="http://schemas.android.com/apk/res/**packagenameofSearchViewClass**"

在第一种方式中,您提供的所有外部自定义视图自定义属性都可以在 xml 中使用,例如 support.v7 和任何其他库,在第二种方式中,您提供的具体外部库自定义视图自定义属性可以在 xml 中使用。

于 2013-10-29T05:47:54.487 回答