1. EditText - 입력상자의 역할
2. 이미지 뷰, 이미지 버튼
- 이미지를 표시하려면 /app/res/drawable 폴더에 이미지가 있어야 합니다.
- srcCompat, src: 표시할 이미지를 지정
- maxWidth, maxHeight : 보여줄 이미지의 최대 너비, 높이 설정
- tint : 이미지뷰의 색을 지정할 수 있습니다.
- scaleType : 이미지 확대, 축소여부를 설정
커서 관련된 속성
- selectAllOnFocus : 텍스트가 입력이 되어있을 때 다른 곳을 클릭했다가 다시 그 텍스트를 클릭하면 텍스트 전체 가 선택되도록 할 수 있는 속성
- cursorVisible : 포커싱이 되었을 때 커서를 안 보이도록 할 수 있습니다.
커서 관련 메서드
- public int getSelectionStart();
- public int getSelectionEnd();
- public void setSelection(int start, int stop);
- public void setSelection(int index);
- public void selectAll();
- public void extendSelection(int index);
링크와 관련된 속성
- autoLink : HTML의 a태그의 역할을 하도록 만들 수 있음
줄 간격 관련 속성
- lineSpacingMultiplier, lineSpacingExtra
대소문자 관련 속성
줄임표시 관련 속성
기타 등등 여러 속성들이 있습니다
문자열 변경 처리 관련 속성
- public void addTextChangedListner(TextWatcher watcher);
[drawable 만들기]
drawable - 뷰 위에 그래픽(그림)을 그릴 수 있음
그림 - 원, 선, 면, 색상을 넣기
XML을 가지고 그래픽을 그릴 수 있게 준비가 돼있음
- 비트맵 드로어블 : 이미지 파일을 보여줄 때 사용
- 상태 드로어블 : 상태별로 다른 비트맵 그래픽을 사용함
- 전환 드로어블
- 셰이프 드로어브 : 색상, 그라데이션을 포함한 도형의 모양을 그릴 때 사용
- 인셋 드로어블
- 클립 드로어블
- 스케일 드로어블
- ...
[/app/res/drawable/back_drawable.xml]
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#7288DB"
android:centerColor="#3250B4"
android:endColor="#254095"
android:angle="90"
android:centerY="0.5"
/>
</shape>
[/app/res/drawable/finger_drawable.xml]
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/finger_pressed" />
<item android:drawable="@drawable/finger" />
</selector>
[/app/res/drawable/rect_drawable.xml]
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
>
<size android:width="200dp" android:height="120dp"/>
<stroke android:width="1dp" android:color="#0000ff"/>
<solid android:color="#aaddff"/>
<padding android:bottom="1dp"/>
</shape>
rect_drawble을 쓰려면 res/values/themes/themes.xml에서 테마를 바꿔줘야 한다.
<style name="Theme.ExampleDrawable" parent="Theme.AppCompat.DayNight.DarkActionBar"> 로 바꿔주어야 한다!
MaterialCompat -> AppCompat으로 바뀐 것.
back_drawble
startColor
centerColor
endColor
...
[이벤트 처리 이해하기]
안드로이드에서의 이벤트 - 대부분 손으로 터치하기 때문에 대부분 터치 이벤트 (Touch Event)가 발생
키패드를 누르면 발생하는 키이벤트(Key Event)
before
on
after
위임 모델
실제 보이는 부분이랑 기능이랑 역할을 구분해서 코드를 관리하기 쉽게 만들어 둡니다.
이벤트 처리 메서드
- boolean onTouchEvent(MotionEvent event)
- boolean onKeyDown(int keyCode, KeyEvent event)
- boolean onKeyUP(int keyCode, KeyEvent event)
[/app/res/activity_main.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00DDFF" />
<View
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#E46D96" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</LinearLayout>
[/app/java/.../MainActivity.java]
package com.koreait.exampleevent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView tv1;
GestureDetector gd;
int backKeyCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = findViewById(R.id.textView);
View view = findViewById(R.id.view);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
float curX = event.getX();
float curY = event.getY();
if(action == MotionEvent.ACTION_DOWN){
// 누르는 이벤트가 발생했을 때
tv1.append("손가락 눌림"+curX+", "+curY+"\n");
}else if(action == MotionEvent.ACTION_UP){
// 눌렀다가 떼는 이벤트가 발생했을 때
tv1.append("손가락 뗌"+curX+", "+curY+"\n");
}else if(action == MotionEvent.ACTION_MOVE){
// 누르고 이동하는 이벤트가 발생했을 때
tv1.append("손가락 이동"+curX+", "+curY+"\n");
}
// return false -> 눌렀을 때 처리를 하다 문제가 발생했다
// return true -> 눌렀을 때 처리가 정상적으로 완료됐다.
return true;
}
});
gd = new GestureDetector(this, new GestureDetector.OnGestureListener() {
private void println(String data){
tv1.append(data + "\n");
}
@Override
public boolean onDown(MotionEvent e) {
println("onDown() 호출됨");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
println("showPress() 호출됨");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
println("onSingleTapUP() 호출됨");
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("onLongPress() 호출됨");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
println("onFling() 호출됨 : "+velocityX+", "+velocityY);
return true;
}
});
View v2 = findViewById(R.id.view2);
v2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gd.onTouchEvent(event);
return true;
}
});
}
@Override
// 현재 액티비티에서 어떤 키를 눌렀을 때 이 메서드가 호출됨
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
// 현재 액티비티에서 뒤로가기 버튼을 눌렀을 때
backKeyCount++;
if (backKeyCount == 1) {
Toast.makeText(this, "시스템 [BACK] 버튼이 눌렸습니다.\n한번 더 누르면 앱을 종료합니다.", Toast.LENGTH_LONG).show();
} else {
finish();
}
}
return true;
}
}
[/app/java/.../OrientationActivity.java]
package com.koreait.exampleevent;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class OrientationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "onCreate 호출됨", Toast.LENGTH_LONG).show();
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, "onStart 호출됨", Toast.LENGTH_LONG).show();
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(this, "onStop 호출됨", Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(this, "onDestroy 호출됨", Toast.LENGTH_LONG).show();
}
}
제스쳐이벤트 - 터치 이벤트 중에서 발생하는 어떤 행동을 의미
- 제스쳐이벤트를 처리하려면 GestureDetector 객체를 만들어야 합니다.
키 입력과 관련된 이벤트 처리 메서드
- onKeyDown(int keyCode, keyEvent event);
- onKeyUp(View v, int keyCode, KeyEvent event);
- keyCode
1. KEYCODE_DPAD_LEFT : 왼쪽 화살표
2. KEYCODE_CALL : 통화버튼
3. KEYCODE_BACK : 뒤로가기 버튼
- 단말 방향을 전환했을 때 이벤트 (기기의 방향을 전환했을 때): Orientation
- 단말의 방향이 바뀌었다 -> 가로, 세로 크기가 달라졌다 / 보여주는 컨텐츠의 배열을 변경
onCreate, onStart, onStop, onDestroy -> 액티비티의 생명주기 메소드
액티비티가 메모리에 로드가 되어야지 화면에 보입니다. -> 액티비티가 메모리에 로드될 때 onCreate 메소드가 호출됩니다.
화면이 보이기 직전에 onStart 메소드가 호출됩니다.
화면이 보이다 없어지면 onStop 메소드가 호출될 수 있습니다.(호출되지 않을 수도 있다)
액티비티가 메모리에서 빠질 때 onDestroy 메소드가 호출됩니다.
사용자에게 알림을 해 줄 경우
- 토스트 : 간단한 메시지를 잠깐 보여주는 기능
a. public void setGravity(int gravity, int xOffset, int yOffset);
b. public void setMargin(float horizontalMargin, float verticalMargin);
- 스낵바 : Material Library(AppBarLayout) 안에 들어있습니다.
- 예, 아니요, 취소 이런 버튼이 있는 메시지를 보여줄 때(알림대화상자)
- 글 삭제, 회원탈퇴 : 삭제와 관련된 주의사항, 탈퇴와 관련된 주의사항 / 예, 아니요, 취소
'웹앱개발 > Android Studio' 카테고리의 다른 글
*2021-05-21 (0) | 2021.06.02 |
---|---|
*2021-05-18 (0) | 2021.06.01 |
*2021-05-17 (0) | 2021.06.01 |
*2021-05-14 (0) | 2021.06.01 |