假设我正在使用可设置属性创建一些新视图.我这样声明它们(这是文档说的方式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TriangleView">
<attr name="direction">
<enum name="NE" value="0" />
<enum name="NW" value="1" />
<enum name="SW" value="2" />
<enum name="SE" value="3" />
</attr>
</declare-styleable>
<declare-styleable name="BannerView">
<attr name="direction">
<enum name="NE" value="0" />
<enum name="NW" value="1" />
<enum name="SW" value="2" />
<enum name="SE" value="3" />
</attr>
<attr name="thickness" format="dimension" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为所有属性显然都在同一名称空间中,我得到错误Error: Attribute "direction" has already been defined.
所以显然我必须将明显重复的属性移到这样的区域之外<declare-styleable>:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="direction">
<enum name="NE" value="0" />
<enum name="NW" …Run Code Online (Sandbox Code Playgroud) android android-custom-view attr declare-styleable android-resources
我有一个 attr 定义为带有值列表的枚举:
<attr name="font" format="enum">
<enum name="AvenirMedium" value="1" />
<enum name="AvenirBlack" value="2" />
</attr>
Run Code Online (Sandbox Code Playgroud)
我想在同一个 .
例如:
<declare-styleable name="CustomView">
<attr name="font" />
<attr name="leftFont" />
<attr name="rightFont" />
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
我没有多次定义枚举,而是试图找到一种方法来定义一次枚举,但让 font、leftFont、rightFont 都使用相同的枚举列表。
有谁知道如何做到这一点?
编辑:我很清楚如何全局定义 attr 并在多个声明样式中引用它。这个问题是在多个具有不同名称的属性中使用枚举。
我有一个自定义视图(扩展视图组),我已经指定了一些在attrs.xml中定义的自定义属性....
<declare-styleable name="datascope">
<attr name="colcount" format="integer" />
<attr name="titleheaderrows" format="integer" />
<attr name="colheaderrows" format="integer" />
<attr name="rowlayout" format="reference" />
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)
整数我可以很好,但最后一个 - rowlayout我想用来引用我将按需膨胀的另一个布局文件.但我找不到在主布局文件中表达rowlayout属性的正确方法.我试过了:
lui:rowlayout="@layout/sensorvaluesdata">
Run Code Online (Sandbox Code Playgroud)
但这在运行时失败:
E/AndroidRuntime(22092):引起:java.lang.NumberFormatException:无法将'res/layout/sensorvaluesdata.xml'解析为整数
和
lui:rowlayout="?layout/sensorvaluesdata"
Run Code Online (Sandbox Code Playgroud)
哪个失败了
E/AndroidRuntime(22341):引起:java.lang.NumberFormatException:无法解析'?2130903043'为整数
这很有意思'因为它似乎已经将资源ID卡在那里,但也坚持?在前面.
我的R.java文件确实有一个明智的行sensorvaluesdata.
public static final class layout {
public static final int sensorvaluesdata=0x7f030003;
}
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
(我可以将信息硬编码到java源代码中,并且工作正常....
View vx = li.inflate(R.layout.sensorvaluesdata, this, false);
Run Code Online (Sandbox Code Playgroud) android custom-controls android-layout android-xml declare-styleable
这是我第一次创建自定义视图,我试图通过XML填充条目 - 以类似于Spinner的方式.我显然在这里做错了,但我在Spinner之后设计了我的方法,所以我没有看到出了什么问题.
为了解释这段代码的意图,我正在创建一个自定义首选项列表.MultiChooserOption是一个允许用户从选项列表中选择多个内容的项目.TextOption简单地定义将在列表中显示的视图,即,是一个标题和一些其他元素,对于TextOption的子类,另一个元素将是文本而不是小部件(复选框等).
以下是应该对我构建它以及我的logcat输出的方式产生任何影响的所有内容的来源.
attrs.xml
<resources>
<attr name="caption" format="string" />
<attr name="options" format="reference" />
<declare-styleable name="TextOption">
<attr name="caption" />
<attr name="text" format="string" />
</declare-styleable>
<declare-styleable name="MultiChooserOption">
<attr name="options" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
MultiChooserOption.java
public class MultiChooserOption extends TextOption<CharSequence> {
public static final String TAG = MultiChooserOption.class.getSimpleName();
private List<CharSequence> options;
private MultiChoiceListView<CharSequence> choiceView;
public MultiChooserOption(Context context) {
super( context );
}
public MultiChooserOption(Context context, AttributeSet attrs) {
super( context, attrs );
initOptions( attrs );
}
private void initOptions( AttributeSet attrs ) …Run Code Online (Sandbox Code Playgroud) 这是我正在使用的代码:
public ASSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray sharedTypedArray = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.ASSwitch,
0, 0);
try {
onText = sharedTypedArray.getText(R.styleable.ASSwtich_onText, null);
} finally {
sharedTypedArray.recycle();
}
}
Run Code Online (Sandbox Code Playgroud)
这是attrs.xml文件(添加到values文件夹):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ASSwitch">
<attr name="onText" format="string" />
<attr name="offText" format="string" />
<attr name="onState" format="boolean" />
<attr name="toogleDrawable" format="string" />
<attr name="frameDrawable" format="string" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
这些问题的答案无法解决问题。请不要认为我的问题是重复的。
更新:似乎我导入了错误的R类。它R不是应用程序的类android.R。
我有活动。在按钮上单击,我想更改主题,但是到处都发现,该主题只能设置一次,而在setContentView之前也可以设置。重新启动活动不是我的选择。也许使用attrs必须解决此问题。但是我不知道如何使用它。请帮忙!!
提前致谢!!
如何在属性中接受方法作为值?就像在视图的 onClick 属性中一样:
<Button android:onClick="onClickMethod"/>
Run Code Online (Sandbox Code Playgroud)
如何定义接受方法的自定义属性?
我知道我们<declare-styleable>在资源中使用,但我们如何让它接受方法?