버튼에 OnClickListener를 설정할 때의 패턴
뷰를 상속할 때 이벤트 처리를 위한 메소드 재정의
boolean onTouchEvent (MotionEvent event)
boolean onKeyDown (int keyCode, KeyEvent event)
boolean onKeyUp (int keyCode, KeyEvent event)
뷰 객체에 전달되는 이벤트를 처리하기 위한 리스너 설정
View.OnTouchListener : boolean onTouch (View v, MotionEvent event)
View.OnKeyListener : boolean onKey (View v, int keyCode, KeyEvent event)
View.OnClickListener : void onClick (View v)
View.OnFocusChangeListener : void onFocusChange (View v, boolean hasFocus)
대표적인 이벤트
터치 이벤트
- 화면을 손가락으로 누를 때 발생하는 이벤트
키 이벤트
- 키패드나 하드웨어 버튼을 누를 때 발생하는 이벤트
제스처 이벤트
- 터치 이벤트 중에서 일정 패턴을 만들어 내는 이벤트
포커스
- 뷰마다 순서대로 주어지는 포커스
화면 방향 변경
- 화면의 방향이 가로/세로로 바뀜에 따라 발생하는 이벤트
제스처를 통해 처리할 수 있는 이벤트
터치 이벤트 처리하기
- SampleEvent 프로젝트를 만들고 XML 레이아웃 구성
메인 액티비티 코드 만들기
View view = findViewById(R.id.view);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
float curX = motionEvent.getX();
float curY = motionEvent.getY();
if (action == MotionEvent.ACTION_DOWN) {
println("손가락 눌림 : " + curX + ", " + curY);
} else if (action == MotionEvent.ACTION_MOVE) {
println("손가락 움직임 : " + curX + ", " + curY);
} else if (action == MotionEvent.ACTION_UP) {
println("손가락 뗌 : " + curX + ", " + curY);
}
return true;
}
});
- 가장 위쪽에 있는 부분을 터치했을 때 가장 아래쪽에 보이는 로그 메시지 확인
제스처 이벤트 처리하기
- GestureDetector 객체 만들고 터치 이벤트 발생 시 해당 객체 전달
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
println("\nonFling \n\tx = " + velocityX + "\n\ty=“ + velocityY);
return super.onFling(e1, e2, velocityX, velocityY);
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
println("\nonScroll \n\tx = " + distanceX + "\n\ty = “ + distanceY);
return super.onScroll(e1, e2, distanceX, distanceY);
}
- 중간 부분을 터치했을 때 가장 아래쪽에 보이는 로그 메시지 확인
키 입력 이벤트 처리하기
뷰를 상속할 때 키 이벤트 처리를 위한 메소드 재정의
boolean onKeyDown (int keyCode, KeyEvent event)
boolean onKey (View v, int keyCode, KeyEvent event)
키를 눌렀을 때 전달되는 대표적인 키값
BACK 버튼 이벤트 처리하기
- 시스템 BACK 키를 눌렀을 때 동작할 코드 정의
- onBackPressed 메소드 재정의 또는 onKeyDown 메소드 안에서 정의
//중략...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "시스템 [BACK] 버튼이 눌렸습니다.", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
//중략...
단말 방향 전환
- 병렬 리소스 로딩 방식 사용
- [res] 폴더 안에 [layout] 폴더와 [layout-land] 폴더 생성
소스 코드에서 토스트 메시지 표시
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showToast("onCreate 호출됨.");
}
@Override
protected void onStart() {
super.onStart();
showToast("onStart 호출됨.");
}
@Override
protected void onStop() {
super.onStop();
showToast("onStop 호출됨.");
}
단말 방향 바꾸었을 때 액티비티가 새로 생성되므로 토스트 메시지 표시됨
단말 방향 전환 시 상태 저장과 복원
- onSaveInstanceState메소드에서 상태 저장했다가onCreate의 파라미터를 이용해 복원
XML 레이아웃 구성
- 입력상자와 버튼 추가
소스 코드에서 값의 저장과 복원
protected void onCreate(Bundle savedInstanceState) {
…
if (savedInstanceState != null) {
name = savedInstanceState.getString("name");
Toast.makeText(getApplicationContext(), "값을 복원했습니다 : " + name, Toast.LENGTH_LONG).show();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("name", name);
}
…
AndroidManifest.xml파일에configChanges속성 설정
…
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
…
소스 코드에서 방향 전환 이벤트 전달받음
public class MainActivity extends AppCompatActivity {
…
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
showToast("방향 : ORIENTATION_LANDSCAPE");
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
showToast("Orientation : ORIENTATION_PORTRAIT");
}
}
}
…
단말 방향 바꾸었을 때 값 액티비티는 유지되고 이벤트 전달받음
알림 대화상자 보여주기 예제
프로그레스바 사용하기
프로그레스바 사용 메소드
레이아웃 만들기
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminateOnly="false"
android:minHeight="20dp"
android:maxHeight="20dp"
android:max="100"
/>
액티비티 만들기메인
ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setIndeterminate(false);
progressBar.setMax(100);
progressBar.setProgress(80);
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("데이터를 확인하는 중입니다.");