更改Android复合控件的启用状态,同时保持其样式设置

更改Android复合控件的启用状态,同时保持其样式设置,android,composite-controls,Android,Composite Controls,我有一个自定义按钮,我已将其实现为复合控件,该控件由以下部分组成: 根目录下的框架布局,我用@android:style/Widget.Holo.Button设计了它的样式,以使其外观和行为像一个按钮; 两个文本视图作为上述FrameLayout的子级,配置为duplicateParentState=true,这样,如果我将FrameLayout上的enabled设置为false,它们将显示为禁用。 修剪后的XML如下所示: <FrameLayout xmlns:android="http

我有一个自定义按钮,我已将其实现为复合控件,该控件由以下部分组成:

根目录下的框架布局,我用@android:style/Widget.Holo.Button设计了它的样式,以使其外观和行为像一个按钮; 两个文本视图作为上述FrameLayout的子级,配置为duplicateParentState=true,这样,如果我将FrameLayout上的enabled设置为false,它们将显示为禁用。 修剪后的XML如下所示:

<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);
}