상세 컨텐츠

본문 제목

[Android Studio] 2-1. 이벤트처리와 토스트

Emzi(김민근)/android

by Emzi 2020. 2. 15. 20:55

본문

*해당 포스팅은 커넥트재단의 edwith-[부스트코스]안드로이드 프로그래밍의 강의 자료를 바탕으로 작성되었습니다.

1.이벤트

OnClickListener메소드를 사용하면 버튼클릭시 함수가 자동으로 호출됩니다. 이벤트의 종류는 터치이벤트, 클릭이벤트, 키이벤트등 다양하게 있습니다.

public class MainActivity extends AppCompatActivity {

    TextView textView;
    View view1;
    View view2;
    GestureDetector Detector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textview);
        view1 = findViewById(R.id.view1);
        view1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();

                float curX = event.getX();
                float curY = event.getY();
                // ACTION으로 사용
                if (action == MotionEvent.ACTION_DOWN){ //누를때 이벤트
                    println("손가락 눌렀음: " + curX + "," +curY);
                }
                else if (action == MotionEvent.ACTION_UP){ //땔때 이벤트
                    println("손가락 땜: " + curX + "," +curY);
                }
                else if (action == MotionEvent.ACTION_MOVE){ //드래그 이벤트
                    println("손가락 움직임: " + curX + "," +curY);

                }
                return true;
            }
        });
        view2 = findViewById(R.id.view2);
        //메소드로 사용
        Detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                println("onDown");
                return true;
            }

            @Override
            public void onShowPress(MotionEvent e) {
                println("onshow");
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                println("onsingle");
                return true;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                println("onscroll" + distanceX + ","+distanceY);
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                println("onlong");

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                println("onfling"+","+velocityX + velocityY);
                return true;
            }
        });
        view2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Detector.onTouchEvent(event);
                return  true;

            }
        });

    }
    // 취소버튼
    @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;
    }

    public void println(String a){
        textView.append( a + "\n");
    }
}

ACTION변수를 사용하여 이벤트를 호출하는 방법이 있고 메소드를 호출하여 사용하는 방법이 있습니다. ACTION_DOWN은 손가락으로 누르고 있을때 발동되고 ACTION_UP은 땔때, ACTION_MOVE은 드래그 할때 발동됩니다.메소드는 onDown,onScroll,onLongPress등 있으며 누를때 , 스크롤 할 때, 길게 누를때 호출됩니다. KEYCODE_BACK은 취소버튼을 누를 때 호출됩니다.

 

2.토스트와 스낵바

토스트는 간단한 메시지를 잠깐 보여주었다가 없어지는 뷰입니다. 앱 개발을 하다보면 중간에 디버깅을 하기위해 메세지를 출력해보고 싶은 경우에 자주 사용합니다. 토스트 메세지는 다음과 같은 코드형태로 많이 사용합니다.

Toast.makeText(Context context, String message, int duration).show();

 

 

스낵바는 아래쪽에서 잠깐 올라왔다가 사라지는 뷰입니다. 토스트랑 차이점은 토스트는 앱화면에 종속되지 않지만, 스낵바는 앱 화면에서 보여줍니다. 보통 경고상태, 긴급상태 등 알림으로 많이 쓰입니다.

 

<예시>

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast toast = Toast.makeText(getApplicationContext(),"위치가 바뀐 토스트",Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP|Gravity.LEFT,200,250);
                toast.show();

            }
        });
        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = getLayoutInflater();
                View layout = inflater.inflate(R.layout.toast, (ViewGroup)findViewById(R.id.toast_layout_root));
                TextView text = (TextView) layout.findViewById(R.id.text);
                text.setText("모양을 바꾼 토스트");

                Toast toast2 = new Toast(getApplicationContext());
                toast2.setGravity(Gravity.CENTER,0,100);
                toast2.setDuration(Toast.LENGTH_LONG);
                toast2.setView(layout);
                toast2.show();
            }
        });
        Button button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Snackbar.make(v, "스낵바입니다.",Snackbar.LENGTH_LONG).show();
            }
        });
        }

    }

 

토스트와 스낵바는 모양도 바꿀수 있는데 이는 inflater를 사용해서 바꿀수 있습니다. inflater는 차후에 다루도록 하겠습니다.

 

3.알림 대화상자

알림 대화상자는 사용자에게 어떤 내용을 알려주거나 '아니오', '예' 버튼을 선택하도록 만들고 싶을 때 사용됩니다.

AlertDialog 객체를 만들고 show 메소드를 이용해 화면에 표시하게 됩니다. 보통 안내 메세지, 타이틀등에 쓰입니다.

public class MainActivity extends AppCompatActivity {
    TextView  taa;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        taa = (TextView)findViewById(R.id.textView);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showmessage();
            }
        });
    }
    public void showmessage(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("안내");
        builder.setMessage("종료하시겠습니까?");
        builder.setIcon(android.R.drawable.ic_dialog_alert);

        builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Snackbar.make(taa,"예를 눌렀어용",Snackbar.LENGTH_LONG).show();
            }
        });
        builder.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Snackbar.make(taa,"아니요 눌렀쪙",Snackbar.LENGTH_LONG).show();
            }
        });

        AlertDialog dialog = builder.create();
        dialog.show();
    }
}

 

2주차는 내용이 많아 인플레이션과 리스튜뷰는 2부에 걸쳐서 진행하겠습니다.

관련글 더보기

댓글 영역