Intereting Posts
Сохранять объект фрагмента во время вращения Android Seekbar не может удалить дополнение / фон Как заблокировать вызов? Как узнать, сколько времени требуется для загрузки макета в Android? Когда рекомендуется запрашивать PendingIntent или LocationListener по запросуLocationUpdates? Как я могу повторно подключить свое приложение при каждом открытии к тому же Bluetooth-устройству с низким энергопотреблением? Установка ImageView ScaleType в «center» не работает, как я ожидаю Как я могу использовать SoundCloud в своем приложении для Android? Android-приложение в haskell Как удалить MinGW и сделать cygwin 'make' как deafult make program с gcc 3.8.1 Могу ли я иметь «мягкую клавиатуру» «adjustResize» и панель инструментов за панель состояния одновременно? Android Animation оставляет линии во время движения Как получить MAC-адрес подключенного Bluetooth-устройства в android Проблема с Android Webview goback () с методом loadDataWithBaseURL На некоторых устройствах оттенок оттенка синего цвета

Как создать стандартные кнопки Borderless (как в упомянутом руководстве по проектированию)?

Я просто проверял руководство по дизайну и задавался вопросом о кнопках без рамки. Я очнулся и попытался найти в источнике, но не мог собрать его сам. Является ли это обычным виджетами Button, но вы добавляете собственный стиль (Android по умолчанию)? Как сделать эти кнопки без полей (конечно, вы можете установить фон пустым, но тогда у меня нет разделителя)?

Здесь ссылки на руководящие принципы проектирования:

  • http://developer.android.com/design/building-blocks/buttons.html
  • http://developer.android.com/guide/topics/ui/controls/button.html#Borderless

Введите описание изображения здесь

Чтобы устранить некоторую путаницу:

Это делается в 2 этапа: установка атрибута фона кнопки для 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> 

Просто добавьте в свой тег Button следующий атрибут стиля:

  style="?android:attr/borderlessButtonStyle" 

Источник: http://developer.android.com/guide/topics/ui/controls/button.html#Borderless

Затем вы можете добавить разделители, как в ответе Карла .

Поздний ответ, но много просмотров. Поскольку API <11 еще не мертв, для заинтересованных здесь есть трюк.

Пусть ваш контейнер имеет желаемый цвет (может быть прозрачным). Затем дайте вашим кнопкам селектор с прозрачным цветом по умолчанию, а также некоторый цвет при нажатии. Таким образом, у вас будет прозрачная кнопка, но при нажатии будет изменен цвет (например, голо). Вы также можете добавить анимацию (например, holo'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 <11)

PS [Newbies]: вы должны определить эти цвета в значениях / colors.xml

Для тех, кто хочет кнопки без полей, но все же анимированные при нажатии. Добавьте это в кнопку.

 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> 

Для стиля материала добавьте style="@style/Widget.AppCompat.Button.Borderless" при использовании библиотеки AppCompat.

Из исходного источника iosched я придумал этот класс 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; } 

Это будет LinearLayout , в который 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> ? <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 делает вертикальный делитель и дополнение. buttonBarButtonStyle задается как тема buttonBarButtonStyle для Holo, но я считаю, что это должен быть самый надежный способ отображать его, поскольку инфраструктура хочет отобразить его.

Изучите атрибуты темы buttonBarStyle , buttonBarButtonStyle и buttonBarButtonStyle .

Вы также можете сделать кнопки без полей через код:

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

Для тех, кто хочет создать кнопку без полей программно для API> = 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); 

Еще одно решение, которое должно работать как на старой, так и на новой платформе 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; } }); 

Его работа прекрасна для меня.

Для тех, кто все еще ищет:

Наследуйте свой стиль для кнопок Holo:

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

Или Холо Свет:

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

И для кнопок Holo без полей:

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

Или Холо Свет:

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

Используйте приведенный ниже код в вашем XML-файле. Используйте android: background = "# 00000000", чтобы иметь прозрачный цвет.

 <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" /> 

Вы можете использовать библиотеку поддержки AppCompat для кнопки Borderless.

Вы можете сделать Borderless Button следующим образом:

 <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"/> 

Вы можете сделать Borderless Colored 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"/> 

По какой-то причине ни для меня не работал ни 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" и этот XML в res / drawable / transparent.xml:

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

Простая голова через стену подходит.

Отличное слайд-шоу о том, как добиться желаемого эффекта от Googles Nick Butcher (начало с слайда 20). Он использует стандартный андроид @attr для @attr кнопки и разделителя.

Добавляя к верхнему ответу, вы также можете использовать представления с темно-серым цветом фона в линейном макете.

 <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 и ширину в соответствии с родительским и наоборот, если ваша линия вертикальна.

Если вы хотите добиться того же программно:

(Это 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" .../>