如何创建标准的无边框按钮(如提到的设计指南)?

时间:2012-01-13 19:03:32

标签: android layout button borderless

我只是检查设计指南并想知道无边框按钮。 我瞪着眼睛,试图在源头找到但不能自己把它整合在一起。 这是普通的Button小部件,但是您添加了自定义(Android默认)样式吗? 如何制作这些无边框按钮(当然你可以将背景设置为空,但是我没有分隔符)?

此处链接到设计指南:

enter image description here

19 个答案:

答案 0 :(得分:162)

澄清一些困惑:

这是通过两个步骤完成的:将按钮背景属性设置为 android:attr / selectableItemBackground 会为您创建一个包含反馈但没有背景的按钮。

android:background="?android:attr/selectableItemBackground"

将无边框按钮与其他人布局分开的线由背景 android:attr / dividerVertical

的视图完成
android:background="?android:attr/dividerVertical"

为了更好地理解,屏幕底部是OK / Cancel无边框按钮组合的布局(如右上图所示)。

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_alignParentBottom="true">
        <View
            android:layout_width="match_parent"
            android:layout_height="1dip"
            android:layout_marginLeft="4dip"
            android:layout_marginRight="4dip"
            android:background="?android:attr/dividerVertical"
            android:layout_alignParentTop="true"/>
        <View
            android:id="@+id/ViewColorPickerHelper"
            android:layout_width="1dip"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="4dip"
            android:layout_marginTop="4dip"
            android:background="?android:attr/dividerVertical" 
            android:layout_centerHorizontal="true"/>
        <Button
            android:id="@+id/BtnColorPickerCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@id/ViewColorPickerHelper"
            android:background="?android:attr/selectableItemBackground"
            android:text="@android:string/cancel" 
            android:layout_alignParentBottom="true"/>
        <Button
            android:id="@+id/BtnColorPickerOk"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:background="?android:attr/selectableItemBackground"
            android:text="@android:string/ok" 
            android:layout_alignParentBottom="true" 
            android:layout_toRightOf="@id/ViewColorPickerHelper"/>
    </RelativeLayout>

答案 1 :(得分:48)

只需在Button代码中添加以下样式属性:

    style="?android:attr/borderlessButtonStyle"

来源:http://developer.android.com/guide/topics/ui/controls/button.html#Borderless

然后您可以像Karl's answer一样添加分隔符。

答案 2 :(得分:22)

迟到的答案,但很多观点。作为API&lt; 11,但是,对于那些感兴趣的人来说,这是一个绝招。

让您的容器具有所需的颜色(可能是透明的)。然后给你的按钮一个选择器,默认透明色,按下时有一些颜色。这样你就会有一个透明的按钮,但在按下时会改变颜色(比如holo's)。您还可以添加一些动画(如holo&#39; s)。选择器应该是这样的:

res/drawable/selector_transparent_button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
          android:exitFadeDuration="@android:integer/config_shortAnimTime">
     <item android:state_pressed="true"
         android:drawable="@color/blue" />

   <item android:drawable="@color/transparent" />
</selector>

按钮应该有android:background="@drawable/selector_transparent_button"

PS:让容器有分隔符(android:divider='@android:drawable/...用于API&lt; 11)

PS [新手]:您应该在values / colors.xml中定义这些颜色

答案 3 :(得分:18)

对于想要无边框按钮但在点击时仍然是动画的人。在按钮中添加。

style="?android:attr/borderlessButtonStyle"

如果你想要它们之间的分隔线/线。在线性布局中添加它。

style="?android:buttonBarStyle"

摘要

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"
   style="?android:buttonBarStyle">

    <Button
        android:id="@+id/add"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add_dialog" 
        style="?android:attr/borderlessButtonStyle"
        />

    <Button
        android:id="@+id/cancel"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/cancel_dialog" 
        style="?android:attr/borderlessButtonStyle"
        />

</LinearLayout>

答案 4 :(得分:7)

对于材质样式,在使用AppCompat库时添加style="@style/Widget.AppCompat.Button.Borderless"

答案 5 :(得分:5)

iosched app source我想出了这个ButtonBar课程:

/**
 * An extremely simple {@link LinearLayout} descendant that simply reverses the 
 * order of its child views on Android 4.0+. The reason for this is that on 
 * Android 4.0+, negative buttons should be shown to the left of positive buttons.
 */
public class ButtonBar extends LinearLayout {

    public ButtonBar(Context context) {
        super(context);
    }

    public ButtonBar(Context context, AttributeSet attributes) {
        super(context, attributes);
    }

    public ButtonBar(Context context, AttributeSet attributes, int def_style) {
        super(context, attributes, def_style);
    }

    @Override
    public View getChildAt(int index) {
        if (_has_ics)
            // Flip the buttons so that "OK | Cancel" becomes "Cancel | OK" on ICS
            return super.getChildAt(getChildCount() - 1 - index);

        return super.getChildAt(index);
    }

    private final static boolean _has_ics = Build.VERSION.SDK_INT >= 
                                        Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}

这将是“OK”和“取消”按钮进入的LinearLayout,并将按照适当的顺序处理它们。然后将其放在您想要按钮的布局中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:divider="?android:attr/dividerHorizontal"
          android:orientation="vertical"
          android:showDividers="middle">
    <!--- A view, this approach only works with a single view here -->
    <your.package.ButtonBar style="?android:attr/buttonBarStyle"
        android:id="@+id/buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1.0">
        <Button style="?android:attr/buttonBarButtonStyle"
            android:id="@+id/ok_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/ok_button" />
        <Button style="?android:attr/buttonBarButtonStyle"
            android:id="@+id/cancel_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/cancel_button" />
    </your.package.ButtonBar>
</LinearLayout>

这使您可以看到带有无边框按钮的对话框。您可以在框架中的res中找到这些属性。 buttonBarStyle执行垂直分隔符和填充。对于Holo主题,buttonBarButtonStyle设置为borderlessButtonStyle,但我相信这应该是框架想要显示它的最强大的显示方式。

答案 6 :(得分:4)

查看主题属性buttonBarStylebuttonBarButtonStyleborderlessButtonStyle

答案 7 :(得分:4)

您也可以通过代码使按钮无边框:

TypedValue value= new TypedValue();
getApplicationContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
 myButton.setBackgroundResource(value.resourceId);

答案 8 :(得分:2)

对于那些想要以编程方式为API&#39; s&gt; = 8

创建无边框按钮的用户
ImageButton smsImgBtn = new ImageButton(this);
//Sets a drawable as the content of this button
smsImgBtn.setImageResource(R.drawable.message_icon);    
//Set to 0 to remove the background or for bordeless button
smsImgBtn.setBackgroundResource(0);

答案 9 :(得分:2)

另一个适用于旧版和新版Android平台的解决方案是使用

android:background="@android:color/transparent"
Button视图的

属性。但添加上面的行后按钮不会提供触摸反馈。

要提供触摸反馈,请将以下代码添加到Activity类

button.setOnTouchListener(new View.OnTouchListener() {          
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:    
                ((Button)view).setBackgroundColor(Color.LTGRAY);
                break;
            case MotionEvent.ACTION_UP:
                ((Button)view).setBackgroundColor(Color.TRANSPARENT);
        }
        return false;
    }
});

它对我来说很好。

答案 10 :(得分:2)

对于仍在搜索的人:

为Holo按钮继承自己的风格:

<style name="yourStyle" parent="@android:style/Holo.ButtonBar">
  ...
</style>

或Holo Light:

<style name="yourStyle" parent="@android:style/Holo.Light.ButtonBar">
  ...
</style>

和无边框的Holo按钮:

<style name="yourStyle" parent="@android:style/Widget.Holo.Button.Borderless.Small">
  ...
</style>

或Holo Light:

<style name="yourStyle" parent="@android:style/Widget.Holo.Light.Button.Borderless.Small">
  ...
</style>

答案 11 :(得分:1)

这是在不使用XML

的情况下以编程方式创建无边框(平面)按钮的方法
ContextThemeWrapper myContext = new ContextThemeWrapper(this.getActivity(), 
   R.style.Widget_AppCompat_Button_Borderless_Colored);

Button myButton = new Button(myContext, null, 
   R.style.Widget_AppCompat_Button_Borderless_Colored);

答案 12 :(得分:1)

在xml文件中使用以下代码。 使用android:background =&#34;#00000000&#34;要有透明的颜色。

<Button
   android:id="@+id/btnLocation"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#00000000"
   android:text="@string/menu_location"
   android:paddingRight="7dp"
/>

答案 13 :(得分:1)

您可以将AppCompat Support Library用于无边框按钮。

你可以制作这样的无边框按钮:

<Button
    style="@style/Widget.AppCompat.Button.Borderless"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp" 
    android:text="@string/borderless_button"/>

你可以像这样制作无边框彩色按钮:

<Button
    style="@style/Widget.AppCompat.Button.Borderless.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp" 
    android:text="@string/borderless_colored_button"/>

答案 14 :(得分:0)

尝试使用此代码,以编程方式删除背景可绘制对象(@ drawable / bg),只需要提供null作为参数即可。

Button btn= new Button(this);
btn.setText("HI");
btn.setBackground(null);

答案 15 :(得分:0)

如果您想以编程方式实现相同目标:

(这是C#但可以轻松转换为Java)

Button button = new Button(new ContextThemeWrapper(Context, Resource.Style.Widget_AppCompat_Button_Borderless_Colored), null, Resource.Style.Widget_AppCompat_Button_Borderless_Colored);

匹配

    <Button
       style="@style/Widget.AppCompat.Button.Borderless.Colored"
    .../>

答案 16 :(得分:0)

添加到顶部答案,您还可以在线性布局中使用深灰色背景颜色的视图,如此。

<View
    android:layout_width="match_parent"
    android:layout_height="1dip"
    android:layout_marginBottom="4dip"
    android:layout_marginLeft="4dip"
    android:layout_marginRight="4dip"
    android:layout_marginTop="4dip"
    android:background="@android:color/darker_gray"/>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="4dip"
    android:orientation="horizontal"
    android:weightSum="1">

    <Button
        android:id="@+id/button_decline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_weight="0.50"
        android:background="?android:attr/selectableItemBackground"
        android:padding="10dip"
        android:text="@string/decline"/>

    <View
        android:layout_width="1dip"
        android:layout_height="match_parent"
        android:layout_marginLeft="4dip"
        android:layout_marginRight="4dip"
        android:background="@android:color/darker_gray"/>

    <Button
        android:id="@+id/button_accept"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_weight="0.50"
        android:background="?android:attr/selectableItemBackground"
        android:padding="10dip"
        android:text="@string/accept"/>
</LinearLayout>

如果你的线是水平线,你需要将高度设置为1dip,宽度设置为与父线相匹配,反之亦然,如果线是垂直的。

答案 17 :(得分:0)

how to achieve the desired effect from Googles Nick Butcher上的精彩幻灯片放映(从幻灯片20开始)。 他使用标准的android @attr来设置按钮和分隔符的样式。

答案 18 :(得分:0)

出于某种原因,style="Widget.Holo.Button.Borderless"android:background="?android:attr/selectableItemBackground"都不适合我。更准确地说,Widget.Holo.Button.Borderless在Android 4.0上完成了这项工作,但在Android 2.3.3上无效。这两个版本的诀窍是android:background="@drawable/transparent"和res / drawable / transparent.xml中的这个XML:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" >
</shape>

平坦的头穿墙。