버튼에 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("데이터를 확인하는 중입니다.");

results matching ""

    No results matching ""