안녕하세요.
보통 다른 언어에서 버튼은 버튼만 써야 하죠.
나만의 버튼을 만들기 위해서는 기본 버튼을 상속해서 커스터마징 하거나 해야 하죠.원하는 아무것이나 이쁘게 만드시고,
해당 아이템의 xml 파일에
android:clickable="true"
태그만 추가하시면 다 되는 놀라운 기능이 있답니다.^^
추가로 백그랑운드에 selector 하나만 추가하면 완벽한 버튼이 된답니다.
오히려 버튼을 커스터마이징 하는 것보다 훨씬 간단하게 원하는 모양을 만들 수가 있답니다.
------------ 추가된 내용입니다. ------
버튼은 쉽게 사용할 수 있는 곳 까지 버튼을 쓰지말자는 것이 아니구요.
버튼이 편할 때는 그냥 버튼을 쓰면 되구요.
그렇지 않은 경우는 버튼이 아니더라도 방법이 많다는 것이랍니다. ^^
최대한 코딩을 쉽게하자는 거죠.
아래 예는 저희 디자이너가 준 버튼의 예제 랍니다.
위 점선 부분 전체가 눌려야 하구요. 눌리면 회색 계열로 전체가 반전됩니다.
옆의 PHOTOS는 멀티 랭기지 지원해야 하기 때문에 이미지로 박으면 안됩니다.
물론 ImageButton을 잘 활용하면 만들수 있겠죠.
또 다른 예 인데요.
오른쪽의 아이콘이 있는데요. (어떤 버튼은 아이콘이 왼쪽으로 가기도 합니다.)
누를 때 배경도 바뀌지만 아이콘도 바뀌어야 한답니다.
이런류의 버튼의 여러개 있고, title 도 바뀌구요.
이런것을 단순히 이미지 3~4개로 미리 만들어서 ImageButton을 사용하려면 좀 그렇죠.
더군다나 안드로이의폰 의 다양한 해상도 때문에 9패치 이미지만으로 처리가 깔끔하지가 않더군요.
그래서 그냥 layout 로 처리 해 버렸습니다.
<LinearLayout android:id="@+id/main_photo" android:layout_below="@+id/line_photo" android:background="@drawable/text_button_background" android:clickable="true" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerHorizontal="true"> <RelativeLayout android:layout_weight="4" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:src="@drawable/icon_photo" android:layout_alignParentRight="true" android:layout_centerVertical="true"/> </RelativeLayout> <TextView android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:textSize="32sp" android:text="@string/photos" android:textColor="@color/text_gray" android:gravity="center_vertical"> </TextView> </LinearLayout>
위 xml 은 layout 파일에서 첫번째 이미지 버튼의 해당하는 부분입니다.
icon의 위치 글자 위치/크기등 마음대로 xml에서 조절이 가능합니다.
버튼처럼 눌려지는 부분과 눌려지는 효과를 보이 부분은 맨 바깥쪽의 LinearLayout 에 지정해 두었습니다.
눌리는 효과에 해당하는 text_button_background.xml 을 drawable 에 만들어 두고요.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/background_check" /> <item android:drawable="@drawable/background_uncheck" /> </selector>
효과에 해당하는 파일을 9패치 파일로 2개 만들어 두었습니다.
실제 코드 상에서는 Button 사용할 때 와 동일하지만,
선언만 View 또는 아이템 형식 LinearLayout 으로 만들어서 사용하면 된답니다.
private View mViewPhotos;
... 중간 생략
mViewPhotos = findViewById(R.id.main_photo); mViewPhotos.setOnClickListener(mPhotosClickListener);
private OnClickListener mPhotosClickListener = new OnClickListener() {
@Override public void onClick(View v) { // 버튼 눌렀을 때 작업할 것을 작성
} };
이렇게 하면 xml 레이아웃을 원하는 대로 바꾸면서 만들 수가 있답니다.
감사합니다.
뭐 버튼은 버튼으로 쓰는게 제일 좋죠.
어지간한건 다 쓸수있고 모양도 맘대로 입힐 수 있으니까요.
버튼이 필요할땐 버튼을 사용하는게 맞습니다.
하지만 이미지가 있거나 텍스트가 많은 뷰를 눌러야 한다면
다른 뷰를 사용하는게 맞죠. 버튼은 너무 크거나 내용물이 많으면 지저분해 보입니다.
사용자는 구분할수 없습니다.
HTML을 예로 들면 table로만 작성한 것과 현재의 웹표준 및 CSS의 조합으로 완전히 똑같은 모습으로 보일수 있는것과 유사합니다.
그러나 웹 표준 및 CSS로 작성해야 하는 이유가 존재하죠... (접근성...)
물론 HTML과 똑같은 이유가 안드로이드에 적용되지 않을 수 있지만
"코드 가독성"이라는 이슈가 존재합니다. 모든 버튼을 다른 뷰로 대체했을 경우 "이것이 버튼역할을 하는 것인가"에 대한
가독성이 떨어지게 됩니다.
할수 있으면 되도록 버튼이라는 넘을 쓰는게 여러사람이 같이 일할때 좋다고 생각합니다.
버튼으로 아예 못하는 케이스는 어쩔수 없지만요...
사용자는 눈앞에 보이는 모습으로만 구분합니다.
실제 개발자가 button이라는 widget을 사용했는지 다른 widget을 활용하여 만들었는지는 사용자에게는 don't care 입니다.
UI적으로 보기에 사용자가 인식하기 쉽고 이쁘면 그만입니다.
프로그램이라는 것이 상황에 따라 어떠한것이 편하기도 불편하기도 합니다.
가독성 면에서 button 만 사용하는게 편할 수도 있겠지만, 경우에 따라서는 button을 사용함으로서 가독성이 오히려 떨어지는 경우도 있읍니다.
굳이 버튼을 사용하지 못하는 케이스에 한해서 타 widget을 사용할 필요는 없다고 봅니다.
그때 그때 상황에 맞춰서 하면됩니다.
그때 그때 상황에 맞춰서 하면 기능은 되나.. 소스 파악하는데는 문제가 됩니다.
위에 언급하였듯이.. 가독성이 중요하기 때문에 같은 기능이라면 명시적인 이름인 Button을 사용하는게
기능적으로 파악하기가 훨씬 편합니다.
사용자가 바라보는 시점에서는 버튼으로 만들었던 이미지로 만들었던 상관안하지만..
프로그래머 입장이라면 가독성도 신경써야 합니다.
들여쓰기. 주석도 가독성에 필요하기때문에 사용하는 스킬이듯이.. 명시적인 Widget 사용도
가독성엔 중요합니다.
기능만 생각하면 모르겠지만 가독성도 생각하여 프로그래밍 하면 그냥가자님 말씀이 옳은거 같네요..
프로그래밍 방식에 있어 누가 옳고 그르다라는 판단 자체가 우수워 보입니다.
프로그램이라는게 단순하게 A가져다 쓰고, B가져다 쓰면 되는게 아니다보니 그때 그때 상황에 따라 사용을 달리하게됩니다.
이런 여러 상황들로 인해 C방식이 더 가독성이 있을 수도 있고 D방식이 더 가독성이 높을 수도 있는 것이구요.
유연성 측면에서는 어느 정도의 가독성을 낮출 수도 있는 문제입니다.
지금 원글을 올리신 분은 여러가지 측면 중 button을 사용하지 않고 다른 widget을 사용하면 더 편할 수도 있는 방법을 제시한것 뿐입니다.
Button을 사용하지 못하는 경우에 한해서만 타 widget을 사용하자는 토론을 하자는 것이 아니구요.
메인 글은 button을 사용하지 않고 다른 widget을 사용하면 더 편할 수도 있는 방법을 제시한것이 아니라 다른 방법으로도 충분히 구현이 가능하다는것을 이야기 한것입니다.
Button widget 자체가 TextView 를 상속받아서 만들었는데 추가한 내용은 없습니다. 그냥 이름만 있을뿐이죠..
그런데 이름을 달리 한 이유가 가독성 때문입니다. TextView로 Button 을 그냥 만들면 되는데..굳이 Button 이라고
추가한 기능도 없는놈을 왜 만들었겠습니까..
소스라인에서는 Button 이라고 명시적으로 쓰면 프로그래머 입장에서는 이게 어떤 역활을 할지..
눈에 그려지기때문에 가독성이 좋아 진다는거죠..
그냥 imageView 혹은 TextView 이렇게 해놓으면 이걸 버튼기능으로 사용한건지 다른 의미로 사용한건지 애매모호해지기때문에..
가독성이 떨어진다는것이고요..
그리하여..가독성 이야기를 먼저 꺼내신 그냥가자 님 말씀이 옳다고 한것 뿐입니다.
원글 작성자가 아니기에 원글자의 입장 표명식 언급은 하지 않겠습니다.
제가 원글을 읽고 느낀건 "Button 이 아니라 다른 View를 사용해서 충분히 유연적인 button생성 가능하다"입니다.
1. Button widget이 TextView 상속받아서 만드는데 추가한 내용 없다구요?
Style 적용되어있습니다.
구글에서 그냥 이름만 변경해서 가독성 높이려고 만들어 놓은거 아닙니다.
2. 가독성 측면에서 누군가 언급하는거 반대안합니다.
댓글 흐름이 button을 사용해야만 한다는 식으로 흘러가는 거 같아 저도 제 생각 적은겁니다.
그중 그냥가자님이 두번에 걸쳐서 강조하시길래 그냥가자님 댓글에 댓글 단 것 뿐이구요.
3. 하지만 Button사용 안한다고 얼마나 가독성 떨어지는지에 대해서는 의문이네요.
뭐 님같은 분을 위해서라면야 가독성을 위해서 button뿐 아니라 style같은 것도 사용하면 안될거 같긴하네요.
4. 지금도 허접하지만 초기 안드로이드 제품들 보면 UI 참 구렸습니다.
구글에서 제공해주는거 이외에는 암것도 사용안한 거 같더군요.
Button 기능에는 button만 사용한다는 생각, 참 위험해 보입니다.
초맨님의 시각에 한가지 문제점을 제기 하면
어째서 "Button"이 "기본으로 지원하는 UI를 지닌 버튼"으로 한정되었나 하는 점입니다.
제가 Button을 쓰자는 것은 HTML에서 마크업 처럼 의미 혹은 논리적인 표현으로서의 중요성을 나타낸것입니다.
Button에도 얼마든지 스타일을 적용할 수 있고 배경을 바꿀수 있습니다.
그리고 제가 말씀드린 예에서도 Button과 다른 뷰가 같은 모양을 보여주는데서 출발합니다.
똑같이 보여줄수 없다면 다른 것을 선택하는데 저도 주저하지 않습니다.
"Button으로 안된다면"이라는 말은 그것을 의미하는겁니다.
웹에서 마크업과 뷰를 위한 스타일이 분리된 것이 안드로이드에서도 이와 같이 작성이 가능하다는 점을 생각하셔야 합니다.
안드로이드에서는 웹에서만큼의 의미를 지니기 어려운 것은 사실입니다.
하지만 여전히 장점을 가지고 있고, 그 장점을 상실해가면서 만들어야 된다면 그 만큼에 부합하는 이유도 존재해야 합니다.
제가 생각하는 그 이유가 "버튼을 사용해서 원하는 뷰 효과를 만들수 없다면"인 거구요.
본문은 팁으로서의 분명한 가치가 있지만 항상 두번째 옵션으로 두어야 한다고 봅니다.
첫번째가 안되면 사용하는 것이죠.
Button widget도 일반적인거 변경가능하단거 몰라서 그렇게 댓글 단거 아닙니다.
원글이 유연성 측면에서 좋은 방향을 제시 할 수도 있겠단 생각을 가지고 있었는데,
특히 selector모르는 사람들에게는 좋은 예가 될 수도 있겠단 생각을 가지고 있었을 뿐입니다.
그런데 댓글로 달리는게 일관성과 가독성 측면에서 윗 내용은 별 필요없다는 식으로 느껴져서 제 생각을 적은겁니다.
물론 님을 비롯한 다른 분들께서 윗 내용이 별 필요없다는 의도를 가지고 댓글을 적지는 않았겠으나,
제가 느끼기에는 흐름이 왠지 좀 이상한거 같아서 두번에 걸쳐 댓글을 쓴 님의 글에 댓글을 적은겁니다.
사용자에게 천편일률적인 UI 를 제공하는냐, 일관성 측면에서는 떨어지더라도 편의성이나 직관적 측면에서 보다 유연한 UI 를 제공하는냐의 논의까지는 하고 싶은 맘 없습니다.
저는 저 팁이 첫번째 옵션으로 남용되는 것에 대한 얘기를 하고 싶었습니다.
버튼과 거의 차이가 없는 코딩량이 들어가기 때문에 쉽게 할수 있죠...
그리고 할수 없다고 생각하는 것도 할수 있다면..
하지만 프로젝트는 저마다 이해의 정도가 다른 사람들이 하는 것인 경우가 많습니다.
그리고 자신의 소스를 오픈할때도 그렇구요.
이럴때 읽기 어려운 코드를 생성해내는 것은 경우에 따라서 무엇보다 위험한 경우도 있습니다.
물론 이런 효과 같은것들은 금방 이해할수 있는 수준이라고 저도 생각합니다만...
한번 더 생각해야 하는것은 차이가 분명 크죠... 그런것에 대해서 조금 비판적인 시각을 보여주고 싶었을 뿐입니다.
그리고 저도 각종 효과등을 몰라서 구현해서 경우도 허다하게 있고.. 나중에 알게되서 고쳐쓰기도 하죠.
찾으면 더 쉽게 되는 효과들이 널려있습니다.
안드로이드 개발을 하면서 느끼는 건데 먼저 찾아보면 아주 신기한 것들 많습니다.
볼레로님께서 예로 드신 내용도 어쩌면 그냥 버튼으로 할수 있을지도 모릅니다.
제가 별것도 아닌걸로 건 태클로 그런거 하나 발견되고 알려진다면 더 좋을거라 생각합니다. 물론 찾아봐야겠죠.
View가 이미 버튼에 필요한 기능을 다 구현하고 있어서 가능한 일이죠 흠 그러나 복잡한 모양을 위해 레이아웃을 꾸며서 버튼으로 활용하는건 득보다 실이 많을듯 합니다. 유지보수 측면에서도 좋지않구요 이미지 몇장으로 해결할 일을 개발자가 레이아웃을 만들어야 하고 레이아웃 계층이 깊어지기도 하구요
안드로이드 Button 소스코드를 살펴보면 그냥 TextView를 상속받고 디폴트 생성자만 선언해서 스타일 덮어씌우고 끝인데 괜히 안드로이드 프레임워크팀에서 이렇게 한게 아니겠죠 하지만 이렇게 가능하다는걸 알아두기만 해도 나중에 아주 유용하게 사용할일이 있을듯 합니다.
버튼에서 백그라운드를 깔아서 쓴다면 글쓴이분의 말씀 틀린거 전혀없지예.
왜들 시니컬하시나유. 코드스타일인데.
물론 코드자체에서 뜻을 알수있다는 점에서 저같은 경우도 버튼을쓰지만영
ImageView는 액자, Button은 버튼용, Layout은 레이아웃, ToggleButton은 토글버튼. 아이들은 유치원. 우리들은 이태원
디폴트 버튼 보다 이쁘고 감각적으로 만들 수 있다면
당연히 환영받을 수 있는 부분이죠.
뭔가 정해놓고 프로그래밍은 이렇게 해야한다~. 라는 정답은 없습니다. (회사에서는 있을 수 있음.-_-;)
비효율적이고 많은 것을 희생하더라도 사용자에게 어필할 수 있다면 그것이 새로운 길이죠^^
모든 개발자가 동일한 방식으로 개발한다면 얼마나 재미없나요..
첫댓글의 중요성을 느낄수 있는 ~.~;;
프레임워크나 api쪽에 조금이나마 관심있으셨던 분들이라면 대부분 아실만한 내용일듯 해서.. 댓글방향이 이렇게 가는 걸 수 도 있다는 생각이 드네요 . 물론 정보공유의 입장에서는 많은 분들에게 유용한 팁이 될 수 있겠지만 위에서 언급되었듯이 개발자가 몰라서 안쓴다기 보다는 UX면을 고려해서 button이나 imagebutton을 편하게 이용하는 것이겠지요. 극단적인 예로 세로스크롤뷰에 클릭이벤트를 구현해 놓으면 사람들이 알아채기 힘들잖아요.. 어짜피 대부분의 컴퍼넌트는 뷰를 상속받기 때문에 리스너만 구현해주면 클릭뿐 아닌 모든 이벤트 처리를 할 수 있습니다.(자바에서도 가능하고 심지어 C++같이 절반이나마 객체지향적인 프로그래밍이 가능한 언어들은 생각보다 쉽게 패턴을 적용해 이벤트 처리를 적용시킬수 있죠.)
이런 글들은 보면서 \ 정보공유면에서 환영을 받아야 한다고 생각합니다.. 더불어 개발 테크닉과 팁에관한 게시판을 좀 더
상세히 나눠 놓으면 좋을 것 같구요..
볼레로님은 제게 이미 좀 친숙하신 분이라 전 장난 반으로 쓴건데 여기 완전 토론장이 됐네요 밤새......버튼을 쓰던 뭘쓰던 앱에 필요한걸 쓰는게 정답이겠지요....버튼으로 구현이 안되는게 있으면 다른 대안을 찾아서 쓰는게 맞는거라고 봅니다. 굳이 버튼의 기능으로 다 표현되는데 다른걸 애써 쓸 이유는 없겠지만 간혹 버튼의 틀에서 벗어나면서도 버튼 기능을 하는 객체들이 필요한 때도 있으니까요. 앱이 뭘 필요로 하느냐가 우선인듯 하네요.
여러분들의 댓글 모두 맞는 이야기 랍니다.
가독성도 중요하고, 코딩량을 줄이는 것도 중요하고, 내 편한대로 쓰는 것도 좋구요.
제가 드리고 싶었던 것은
Button 이나 ImageButton 이나 이것으로 자신의 생각을 제한시키지 말자는 이야기 랍니다.
저도 textView Layout같은걸로 버튼 만들어서 해봤는데요.
결국 똑같은 거 같네요. 다만 레이아웃 등으로 하면 버튼 내에 구현할 수 있는 것이 좀 늘어나죠. (뭐 이마저도 이미지를 직접 떠버리면 버튼으로도 다 구현되겠습니다만.)
가독성은...ㅋ;;;;
말로 토론을 하면 끝이 없습니다. 말은 꾸미기 나름이니까요. 각자 알아서 사용하시면 됩니다.
소스 가독성은... 자기가 만든거 아니면 다 안좋다고 생각하는데요..
다양한 구현방법을 습득하고 있는것은 매우 중요한 일이죠.. ^.^
좋은글 감사합니다.
한가지 추가하자면 캡쳐 이미지와 같이 구현하고자 할때 저라면 리스트뷰를 쓸것 같네요 ^^
좋은 글 감사합니다.^^
위의 내용은 토론이라 굳이 언급하지 않겠습니다.
저에게는 만족스러운 글이며 저는 UI꾸밀 때 버튼을 사용하는 것을 정말 좋아하지 않습니다.
디자인이 망가지는 경우가 워낙 많아서요^^
(제가 잘 못하는 이유도 있습니다;)
글쓰신 분이 왜 버튼을 쓰냐고 의문형으로 제목을 하신 이유가
버튼을 안쓰고도 버튼효과를 나타낼수 있는 여러가지 방법이 있다는걸 강조하고 싶어서인거같은데요.
좋은 팁입니다.
많은 분들이 왜 버튼을 쓰냐는 질문을 너는 잘못됐다로 받아들이시는것같네요.
사고구조를 너무 굳혀놓지 않고 다양한 방법을 생각하보는게 개발자로서의 마인드라 생각합니다.
헐~~ 사람들 얘기를 보니 굉장히 많은 의견이 ;;;;;
전 그냥 버튼 백그라운드에 이미지 박아버렸어요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
물론 다운이나 업에 대한 효과는 구차나서 안했지만 그것도 구현은 가능하더라구요
다운 상황에서 이미지 바꾸고 업 상황에서 돌려놓으면서 실행되게 해도 되고
Button을 사용하든.. ImageButton 을 사용하든.. 뭘 사용하든..
내 코드는 내가 봐도 못알아먹는 극악의 가독성이라... ㅠ
의미 없는 싸움 ㅠㅠ
굉장히 유용한 글입니다. ^^
전체적인 테마와 버튼이 맞지 않아서 다양한 방법으로 UI구상 중이었는데, 말씀하신대로 LinearLayout으로 원하는대로 조작할 수 있을 것 같네요.
백그라운드 이미지보다 프로그램실행속도면이나 용량측면, 가변해상도를 생각했을 때, 글쓰신분의 방식이 저에겐 아주 딱 맞는것 같습니다. ^^
꽤 많은 의견이 나온것 같은데요.
이미 시간도 오래 되었지만.. 저도 딱히 버튼을 꼭 써야 하는 필요성을 못 느끼고 있다가 이제서야 느끼게 되어 댓글 남겨요.
버튼을 꼭 써야 하는 이유는.. 접근성 때문이라고 생각됩니다.
가령.. TextView 를 버튼처럼 사용한 UI 에서 Talkback 을 활성화 시킨 후 포커스가 해당 TextView 에 활성화되면 그냥 텍스트만 읽어줍니다.
하지만 Button 을 사용하면 Talkback 에서 'xxx 버튼' 이라고 읽어주죠.
구글에서 만든 Talkback 은 소스코드가 오픈되어 있지 않아 확인이 불가능하지만
오픈소스인 (https://code.google.com/p/eyes-free/) 코드를 살펴보면 '버튼'을 읽어주는 부분이 Class 이름으로 구분하게 되어 있습니다.
물론 TextView 를 사용하여 접근성 관련된 코드를 수정하면 되겠지만.. 한번 해보려 하니 구글문서도 제대로 설명이 안되어 있어서 꽤 어렵더라구요.
그리고 제가 모르는 경우도 많이 있을 것 같고요.
눈으로 보이는 것도 중요하지만.. 눈에 안 보이는게 있을수도 있기에 최대한 버튼을 활용하는게 좋을 것 같습니다.
그래도 간단한건 역시 버튼이죠...
또한 버튼 기능인 것은 되도록 버튼으로 하는게 알아보기 쉽구요...
뷰나 레이아웃으로 버튼 대체하는 것은 이미 알고 쓰기도 했습니다만... 되도록이면 버튼쓰는게 낫다고 생각합니다.
그게 안되면 만들어야 겠지만요...