如何从自定义属性中引用Android属性layout_width?

8

我希望将我的应用程序在xlarge设备上的使用与其他设备上的使用分开,以限制xlarge设备上layout_width参数为720dp。为此,我创建了values/attrs.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <attr name="layoutWidth" format="reference|dimension" />
</resources>

使用自定义参数layoutWidth来设置它的宽度。
android:layout_width="?layoutWidth"

进一步地,在 values-xlargevalues 目录下,我需要指定两个 themes.xml 文件,分别用于大屏和普通设备:

values-xlarge/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme" parent="android:Theme">
        <item name="layoutWidth">720dp</item>
    </style>
</resources>

values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme" parent="android:Theme">
        <item name="layoutWidth">What should I write here!?</item>
    </style>
</resources>

那么,在这个地方,我如何引用Android中的“fill_parent”参数?看起来像@android:layout_width/fill_parent,但是我编译时出现了错误。
 No resource found that matches the given name (at 'layoutWidth' with value '@android:layout_width/fill_parent').
4个回答

10

我已经通过修改 values/attrs.xml 的方式找到了解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<resources>    
    <attr name="layoutWidth" format="dimension">
        <enum name="fill_parent" value="-1" />
        <enum name="match_parent" value="-1" />
        <enum name="wrap_content" value="-2" />
    </attr>
</resources>

现在,我可以在values/themes.xml中编写:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme" parent="android:Theme"> 
        <item name="layoutWidth">match_parent</item>
    </style>
<resources>

但问题仍然存在:是否可以从这个位置引用Android的layout_width参数?


嗯...这总比没有好...既然这些常量在官方Javadoc中,它们不应该很快改变...老实说,fill_parent和match_parent在某个时候被合并为一个常量(-1)。它们一开始是不同的。 - Daniele Segato

3

您应该在values文件夹中创建attrs.xml文件,然后添加以下代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="custom_match_parent" type="dimen">-1</item>
    <item name="custom_wrap_content" type="dimen">-2</item>
</resources>

要访问上面创建的attrs.xml,请在您的dimens.xml文件中添加以下行:
<dimen name="max_layout_width">@dimen/custom_match_parent</dimen>

现在,要从布局文件中访问它,你必须像这样做。
<FrameLayout
    android:layout_width="@dimen/max_layout_width"
    android:layout_height="match_parent">
    <!--Do what you like to do here-->
</FrameLayout>

希望这能帮到你!:-)

1

好的,这是一个晚了的回复...但是为了记录和理智,答案可以在下面找到,更多信息可以在http://developer.android.com/guide/topics/ui/themes.html中找到。

styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="YourStyle" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>
</resources>

这应该适用于任何使用android:layout_width的父样式,例如parent="@android:style/Widget.TextView"。

0

不确定您是否可以在资源或样式标签中添加此属性,但如果合法的话可能会有所帮助。

xmlns:android="http://schemas.android.com/apk/res/android"

这指定了定义layout_width和layout_height的命名空间(以及常量fill_parent和wrap_content)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接