使用标准的Android按钮,但有修改

时间:2012-07-12 17:19:03

标签: android button drawable

我正在尝试在我的布局中使用标准的android按钮,但是在未按下时使背景透明,或者使文本向左或向右对齐,或者我想要的任何自定义修改。是否有一些简单的方法我缺少从标准按钮继承但更改一些属性?我看了下面的两个帖子,无法让它们工作,而且太新了,不能在这些页面上发表评论,而且这两个解决方案都有问题:

我已经尝试按How to disable the default Button color changing property on onClick复制@android:drawable / btn_default源,但是从那里链接到的所有资源都是私有的。我试图找到这些私人文件的来源,但是其中一些我找不到即使我进入android sdk文件夹来获取原始文件。我在哪里可以找到这些文件,如果这是编辑标准按钮的方法?复制那些私人文件肯定不是理想的,但如果标准选择/按下/任何按钮在另一个api中改变,在这种情况下我仍将使用旧的,并且按钮不一致......

另外,我已经看到Standard Android Button with a different color这对于制作自定义按钮很有用,但是如何将其设置为与标准按钮完全相同?即什么是颜色,渐变是正确的,等等。再次,这有一个问题,如果标准按钮更改我仍将使用旧值。

2 个答案:

答案 0 :(得分:2)

在按钮上使用样式:

<Button id= ... style="@style/myButton" />

值/ styles.xml:

<style name="myButton" parent="@android:style/Widget.Button">
  <item name="android:background">@drawable/myBackground</item> 
</style>

要处理各种按钮状态(例如按下等),您需要一个选择器可绘制资源,例如drawable / myBackground.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!--  Non focused states 
  --> 
  <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/button_unfocused" /> 
  <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/button_unfocused" /> 
 <!--  Focused states 
  --> 
  <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/button_focus" /> 
  <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/button_focus" /> 
 <!--  Pressed 
  --> 
  <item android:state_pressed="true" android:drawable="@drawable/button_press" /> 
</selector>

drawable / button_press.xml可以根据需要指定渐变,形状,边框等。

执行背景渐变,圆角和边框的示例button_press.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <stroke android:width="1dp" android:color="#FF404040" /> 
  <corners android:radius="6dp" /> 
  <gradient android:startColor="#FF9B00" android:centerColor="#FFB300" android:endColor="#FFCA00" android:angle="90" /> 
</shape>

答案 1 :(得分:0)

CSmith关于使用带有parent =“@ android:style / Widget.Button”的样式的答案的第一部分是更改按钮属性(如左对齐或右对齐文本)的最佳方法。然而,答案的其余部分描述了如何创建自己的选择器,所以我想我会将我的解决方案添加到继承选择器的默认按钮,然后只是覆盖您想要更改的特定选择器: / p>

为那些你想要默认行为的选择器添加android:drawable =“@ android:drawable / btn_default”,然后你只需为那些你想要更改的选择器指定自定义字段。在我试图拥有一个继承所有选择器但通常具有透明背景而不是灰色背景的按钮的情况下,请执行以下操作(为了清楚起见,请复制CSmith答案的第一部分,感谢CSmith!):

使用自定义样式定义按钮:

<Button id= ... style="@style/myButton" />

RES /值/ styles.xml:

<style name="myButton" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/myBackground</item>
    ...other changes to default button... 
</style>

然后,继承所有选择器,只覆盖显示灰色的选择器: 在res / drawable / myBackground.xml中:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" 
          android:drawable="@drawable/transparent_btn" />    
    <item android:state_pressed="true"
          android:drawable="@android:drawable/btn_default" />
    <item android:state_focused="true"
          android:drawable="@android:drawable/btn_default" />
    <item android:drawable="@drawable/transparent_btn" />
</selector>

,在res / drawable / transparent_btn.xml中:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/transparent" />
</shape>

注意:此示例并不担心state_enabled,如果您想要启用按钮的具体行为是否也只是覆盖这些选择器。