我有一个自定义 View ZoneSwitchItem(扩展了 LinearLayout),我在 fragment 布局 xml 中使用它。
在自定义 View 中,我需要获取在 fragment xml 中分配给它的 ID。所以我使用 attrs.getIdAttribute(); 但它返回 null 而不是预期的 ID zone1。
我可以添加一个自定义属性 ZoneSwitchItemId 但如果我可以使用默认的 id 属性,我想避免这种情况。
fragment xml中的用法:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<com.android.common.ZoneSwitchItem
android:id="@+id/zone1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/cardPadding4x"
android:gravity="center_horizontal"
app:zoneItemStyle="ArmourFont_HeadlineBig" />
...
自定义 View :
public class ZoneSwitchItem extends LinearLayout {
private TextView itemValue;
private TextView itemTitle;
public ZoneSwitchItem(Context context) {
super(context);
init(context, null);
}
public ZoneSwitchItem(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ZoneSwitchItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
public void onStart() {
EventBus.getDefault().register(this);
}
public void onStop() {
EventBus.getDefault().unregister(this);
}
private void init(final Context context, AttributeSet attrs) {
inflate(getContext(), R.layout.zone_switch_item, this);
itemValue = findViewById(R.id.itemValue);
itemTitle = findViewById(R.id.itemTitle);
if (attrs != null) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ZoneSwitchItem, 0, 0);
try {
if (typedArray.getString(R.styleable.ZoneSwitchItem_zoneItemStyle) != null &&
typedArray.getString(R.styleable.ZoneSwitchType_zoneItemImage).equals("ArmourFont_HeadlineBig")) {
itemValue.setTextAppearance(context, R.style.ArmourFont_HeadlineBig);
}
} finally {
typedArray.recycle();
}
}
final String id = attrs.getIdAttribute(); // <<== returns null
itemValue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new OnZoneSwitchItemClickedEvent(id));
}
});
}
public void setSelected(boolean selected) {
float alpha;
if (selected) {
alpha = 1.0f;
} else {
alpha = 0.5f;
}
itemValue.setAlpha(alpha);
itemTitle.setAlpha(alpha);
}
}
最佳答案
documentation for the AttributeSet#getIdAttribute() method状态:
Return the value of the "id" attribute or null if there is not one. Equivalent to getAttributeValue(null, "id").
the getAttributeValue() method中的第一个参数是属性的命名空间。这就是问题所在,因为 null 表示没有命名空间,但是 android:id 属性位于 android 前缀表示的命名空间中 – http://schemas.android.com/apk/res/android d。
这意味着 getIdAttribute() 方法将只返回没有前缀的 id 属性的值。即:
<com.android.common.ZoneSwitchItem
id="@+id/zone1"
... />
我不确定这个方法有多大用处,因为对于上面的示例,它实际上会返回完整的字符串 (@+id/zone1),您仍然需要有一个单独的 android:id 属性来为 View 正确分配一个 ID,Android Studio 肯定会提示该属性缺少命名空间前缀。
可能想到的第一个解决方案是直接调用 getAttributeValue(),并传递正确的命名空间。
String id = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "id");
但是,这将以字符串形式返回整数 ID 值,并以 @ 为前缀,因为 aapt 似乎在其处理过程中直接替换了 XML 中的该值。
可以从 Resources 获取实际的、简单的资源名称,使用它的 getResourceEntryName() 方法,以及 View 的 >getId() 方法,因为 ID 将在 super 调用期间在 View 的构造函数中设置。例如:
String id = getResources().getResourceEntryName(getId());
关于android - 获取自定义 View 的 xml id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47512481/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin