Event1

Du-Hyeon, Kim·2023년 8월 30일
0

Android

목록 보기
5/12

Event1

3Views log event shower

1. onTouchListener

View자체를 touch했을때, 호출되는 함수

textView = findViewById(R.id.textView);

        View view = findViewById(R.id.view);
        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //onTouch에 대한 event를 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;
                //on touch 정상 처리완료
            }
        });

2. GestureDetector handler

touch event를 gesturedetect해주는 객체
new gesturedetector 객체 정의

GestureDetector detector;

전달된 event에 대한 gesture로 변화하여 처리

detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(@NonNull MotionEvent motionEvent) {
                println("onDown 호출됨");
                return true;
            }

            @Override
            public void onShowPress(@NonNull MotionEvent motionEvent) {

            }

            @Override
            public boolean onSingleTapUp(@NonNull MotionEvent motionEvent) {
                return false;
            }

            @Override
            public boolean onScroll(@NonNull MotionEvent motionEvent, @NonNull MotionEvent motionEvent1, float v, float v1) {
                return false;
            }

            @Override
            public void onLongPress(@NonNull MotionEvent motionEvent) {
                println("onLongPress 호출됨");
            }

            @Override
            public boolean onFling(@NonNull MotionEvent motionEvent, @NonNull MotionEvent motionEvent1, float v, float v1) {
                //velocity정보도 전달됨
                println("onFling 호출됨 : " + v +", " + v1);
                return true;
            }
        });

view에서 발생한 onTouch event 객체를 detector로 넘겨서 처리함

View view2 = findViewById(R.id.view2);
        view2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                detector.onTouchEvent(motionEvent);
                //event처리를 gesturedetector로 넘김
                return true;
            }
        });

3. key event handling

back button에 대한 화면 전환 제한 코드

editor > mouse right click > generate > override methods
activity 화면 안에 들어있는 함수들을 재정의할 수 있도록 함

@Override
    //원래 정의된 onKeyDown이라는 기본 api를 내가 직접 override하겠다는 뜻
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            println("system back button onClicked");
            return true;
            //back 실행 안됨
        }
        return  false;
    }

Orientation

화면 방향에 따른 event 처리

1. layout-land xml추가

res > "layout-land" directory 추가

가로방향 layout으로 자동으로됨
layout-land 인식함 android studio가

2. layout 초기화 확인

방향 전환은 layout자체를 껐다가,
land방향을 다시 불러오는 과정이다

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showToast("onCreate 호출됨");

    }

    public void showToast(String data){
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        showToast("onDestroy 호출됨");
    }
}

create와 destory toast message로 확인 가능


따라서, 방향 전환시 화면상 data는 따로 저장해야됨

3. onSaveInstanceState

generate > override methods > onSaveInstanceState
현재 activity에 관련된 무언가?

가로방향 plainttext에 글자 저장 -> name에 저장 -> activity 종료시 onSaveInstanceState 의 name이라는 key에 값 저장

세로방향 textView2에 name 불러와짐

4. logchat

error의 경우는 logchat을 통해서 어떤 오류로 종료됐는지 알 수 있음

지금 button이 세로화면에만 있는데,
이때 가로화면에서 button에 setonclicklistner가 붙을 객체가 없기 때문에 앱이 강제종료된다.
따라서 button != null을 추가해서 강제종료를 막는다.

0개의 댓글