更改Android复合控件的启用状态,同时保持其样式设置
我有一个自定义按钮,我已将其实现为复合控件,该控件由以下部分组成: 根目录下的框架布局,我用@android:style/Widget.Holo.Button设计了它的样式,以使其外观和行为像一个按钮; 两个文本视图作为上述FrameLayout的子级,配置为duplicateParentState=true,这样,如果我将FrameLayout上的enabled设置为false,它们将显示为禁用。 修剪后的XML如下所示:更改Android复合控件的启用状态,同时保持其样式设置,android,composite-controls,Android,Composite Controls,我有一个自定义按钮,我已将其实现为复合控件,该控件由以下部分组成: 根目录下的框架布局,我用@android:style/Widget.Holo.Button设计了它的样式,以使其外观和行为像一个按钮; 两个文本视图作为上述FrameLayout的子级,配置为duplicateParentState=true,这样,如果我将FrameLayout上的enabled设置为false,它们将显示为禁用。 修剪后的XML如下所示: <FrameLayout xmlns:android="http
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@android:style/Widget.Holo.Button"
android:id="@+id/layout_button">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLACEHOLDER"
android:layout_gravity="center_horizontal|top"
android:duplicateParentState="true"
android:id="@+id/text_button1"
android:textSize="24sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLACEHOLDER"
android:layout_gravity="center_horizontal|bottom"
android:duplicateParentState="true"
android:id="@+id/text_button2"
android:textSize="12sp"/>
</FrameLayout>
如果我理解正确,使用此控件时,构造的层次结构将用括号表示视图的定义位置:
FrameLayout (Java) -> FrameLayout (XML) -> 2x TextViews (XML)
我希望能够通过获取对按钮的引用并设置enabled属性来切换是否启用自定义按钮,如下所示:
CustomButton button = (CustomButton)findViewById(R.id.button);
button.setEnabled(false);
但是,这不起作用,因为XML中定义的FrameLayout不会继承其父级的属性,因此按钮将继续显示为已启用
我尝试将duplicateParentState=true添加到XML中定义的FrameLayout中,但在这种情况下,我的style属性被覆盖/继承,控件看起来不再像按钮
我还尝试过使用merge标记并以编程方式设置样式,但据我所知,无法以编程方式设置视图样式
到目前为止,我的解决方法是覆盖CustomButton上的setEnabled方法,如下所示:
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
findViewById(R.id.button_rootLayout).setEnabled(enabled);
}
这是可行的,但是我现在必须对我想通过编程修改的每个属性都这样做,而且我在注册OnClickListeners时也遇到了类似的问题
有更好的办法吗?怎么样:
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setClickable(enabled);
}
这就是我最后做的 你有什么理由从FrameLayout而不是button派生自定义按钮吗?按钮不是视图组,因此我无法将膨胀的布局附加到它,并且我需要布局,因为定位过于复杂,无法使用button的标准setText来处理。当你说你的FrameLayout是用XML定义的时,我感到困惑。您应该能够在XML中使用标记。可以显示布局文件的相关部分吗?我指的是定义复合控件的XML,而不是使用复合控件的XML布局。我已经更新了问题。
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setClickable(enabled);
}