2020 안드로이드 스튜디오 자바 소스 파일로 커스텀 버튼(Custom Button) 만들기
xml 파일 없이 java 소스 파일로만 버튼을 상속 받아 새로운 버튼 객체를 만들 것입니다.
버튼을 클릭 시 배경색이 바뀌도록 설정합니다.
STEP 1 자바 클래스 만들기
- 저는 클래스명을 CustomButton이라고 했습니다.
- AppCompatButton를 상속받습니다.
STEP 2 생성자 만들기
- 맥이라면 Cmd + N 단축키 눌러서 생성자를 쉽게 가져옵니다.
- 파라미터 Context만 받는 것과 Attribute랑 같이 받는 것 두 개를 불러 옵니다.
STEP 3 버튼 초기 모습을 설정하기 위해 init()메서드를 만듭니다.
3.1 res 폴더 - dimens xml 파일을 추가합니다.
<resources>
<dimen name="textSize">16dp</dimen>
</resources>
3.2 init 메서드에 아래 코드를 입력해주세요.
//폰트 크기는 16dp, 기본 배경은 파랑
private void init(){
float fontSize = getResources().getDimension(R.dimen.textSize);
setTextSize(fontSize);
setBackgroundColor(Color.BLUE);
}
STEP 4 버튼이 터치되었을 때 실행할 메서드를 작성합니다.
4.1 맥이라면 cmd + N 단축키를 눌러 오버라이딩 합니다.
4.2 onTouchEvent를 찾아 클릭합니다.
4.3 아래 코드를 작성합니다.
// 터치 시 빨강배경으로 바뀜
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN){
setBackgroundColor(Color.RED);
setTextColor(Color.WHITE);
}else {
setBackgroundColor(Color.BLUE);
}
// 뷰 모양이 변경되고 뷰를 무효화하여 시스템이 다시 뷰를 그릴 수 있 호출해야하는 메서드
invalidate();
//true라고 해야 이벤트를 계속 발생할 수 있다. 성공했다 해야하니까
return true;
}
STEP 5 커스텀 버튼을 출력할 액티비티에 태그로 작성합니다.
- 태그에는 패키지명까지 들어가야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#CDDC39">
<com.boostcourse.practice0522.CustomButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="서브뷰"
android:textSize="32sp" />
</LinearLayout>
STEP 6 애뮬레이터로 결과물을 확인합니다.
전체코드
package com.boostcourse.practice0522;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.appcompat.widget.AppCompatButton;
public class CustomButton extends AppCompatButton {
// 코드에서 View를 동적으로 만들 때 사용하는 간단한 생성자
public CustomButton(Context context) {
super(context);
init();
}
// xml에서 View를 전개(inflation) 할 때 호출되는 생성자
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
//폰트 크기는 16dp, 기본 배경은 파랑
private void init(){
float fontSize = getResources().getDimension(R.dimen.textSize);
setTextSize(fontSize);
setBackgroundColor(Color.BLUE);
}
// 터치 시 빨강배경으로 바뀜
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN){
setBackgroundColor(Color.RED);
setTextColor(Color.WHITE);
}else {
setBackgroundColor(Color.BLUE);
}
// 뷰 모양이 변경되고 뷰를 무효화하여 시스템이 다시 뷰를 그릴 수 있 호출해야하는 메서드
invalidate();
//true라고 해야 이벤트를 계속 발생할 수 있다. 성공했다 해야하니까
return true;
}
}
'컴퓨터 공학 > Android' 카테고리의 다른 글
네이버 부스트코스 안드로이드 프로그래밍 프로젝트3) 4서비스-5브로드캐스트 수신자 개념 연습문제 (375) | 2020.05.28 |
---|---|
네이버 부스트코스 안드로이드 프로그래밍 프로젝트3) 1화면전환~3수명주기 개념 연습문제 (420) | 2020.05.28 |
[2020 안드로이드 스튜디오] 스피너 (spinner) 사용 예제 (371) | 2020.05.16 |
[2020 안드로이드 스튜디오] 리스트뷰(ListView), 어댑터(Adapter) 이해 &기본예제 (394) | 2020.05.16 |
[2020 안드로이드 스튜디오] Drawable 드로어블 배경 효과 총정리 (410) | 2020.04.23 |
댓글