2022. 10. 10. 15:37ㆍDev.Program/Android
file - close project
- start a new
======== ch2.p67.self_2_3
< 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" tools:context=".MainActivity" android:orientation="vertical"> </LinearLayout> |
- Textview 지우고(블럭 지정 후 Ctrl + Y) 레이아웃 수정하기
- android:orientation="vertical" 추가 / 이렇게가 기본!
- 이제 별 말 없으면 LinearLayout을 쓸 거!
> 버튼 만들 때 width와 height
- wrap_content 글자 크기만큼
- match_parent 부모 속성만큼
>
<!-- 버튼 4개 생성(홈페이지 열기, 전화걸기, 갤러리열기, 끝내기) --> <androidx.appcompat.widget.AppCompatButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnHomepage" android:text="홈페이지열기"/> <androidx.appcompat.widget.AppCompatButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnCall" android:text="전화걸기"/> <androidx.appcompat.widget.AppCompatButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnGallery" android:text="갤러리열기"/> <androidx.appcompat.widget.AppCompatButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnFinish" android:text="앱종료"/> |
- 버튼
< MainActivity.java >
onCreate → 자바의 main() 과 같음
- 멤버변수로 만들수도있음(지금은 이렇게 안함)
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button 위젯 ID 4개 가져오기 = findViewById(R.id.XXX) Button btnHomepage = findViewById(R.id.btnHomepage); Button btnCall = findViewById(R.id.btnCall); Button btnGallery = findViewById(R.id.btnGallery); Button btnFinish = findViewById(R.id.btnFinish); btnHomepage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "홈페이지열기", Toast.LENGTH_SHORT).show(); } }); btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "전화걸기", Toast.LENGTH_SHORT).show(); } }); btnGallery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "갤러리열기", Toast.LENGTH_SHORT).show(); } }); btnFinish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "앱종료", Toast.LENGTH_SHORT).show(); } }); } } |
- 실행하는 단말기
- 실행화면
- 버튼 클릭했을 때 밑에 뜨면 성공!
# tip
- 이거 설정하면 대문자 안써도 자동완성됨! (Toast 같은 예약어 입력할 때!)
> 전화걸기
- 이건 자바꺼(이거 아님!!!)
btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:/0518030909")); startActivity(intent); } }); |
- 실행화면! (버튼 누르면 이 화면으로 넘어감!)
- Ch2. 69p
- Avtivity 클래스와 Layout 파일! 이 두개가 기본 세트!
- 나중에 자바코드로도 변경가능!
- 앱의 여러가지 정보를 담고있다
< Chapter4 >
< 뷰 >
- 7p
> developer.android.com
- 안드로이드 기본api
- 이 홈페이지는 현업가서도 참조 많이 할 거.,,
- background
- #XXYYZZ : XX-RED칼라 YY-GREEN칼라 ZZ-BLUE칼라 16진수 (#ffffff 흰색)
- 파란색
- 녹색
- 노랑
- 빨강
- 실행창
- 왼쪽에 뜨는 박스 더블클릭하면 색 지정도 가능
- 13p
- 레이아웃 색상도 변경가능(15p)
- 리니어 레이아웃
- android:orientation="vertical"
- 세트!
- 실행된 프로젝트 종료
======== 새 프로젝트 만들기 0605_BasicAttribute
< padding 속성 >
자신의 내부에 들어있는 위젯(또는 텍스트 등) 등과 자신의 경계선 사이 간격 지정
ex) 레이아웃에 padding 속성을 지정할 경우 레이아웃 내의 위젯과 레이아웃 간격을 조절
ex2) EditText 에 padding 속성을 지정할 경우 EditText 에 입력되는 텍스트 위치 간격을 조절
< layout_margin 속성 >
자신과 부모 레이아웃 또는 주변 위젯과의 간격 지정
ex) TextView 에 layout_margin 속성을 지정할 경우 TextView 위젯과 다른 위젯의 간격 조절
- 글자에는 보통 sp 사용
> EditText
- placeholder 같은 기능
<?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" tools:context=".MainActivity" android:orientation="vertical"> <!-- TextView : 텍스트를 표시하는 위젯 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="아래에 이름을 입력 : " android:textSize="20sp"/> <!-- EditText : 텍스트를 입력받는 위젯 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:hint="이름"/> <!-- Button : 사용자로부터 클릭을 입력받는 위젯 --> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="확인" android:textSize="20sp"/> </LinearLayout> |
- 실행창
- 이름이라고 적혀있는 거 클릭하면 이렇게 가상키보드 뜸
- 글씨 외에는 보통 dp 라고 씀(스크린 비율에 맞춤)
패딩적용후⇒
> margin
- margin 추가
마진적용후 ⇒
> EditText 만 마진에서 패딩으로 바꿨을 때
- 띄워진 거 볼 수 있다!
======== 새프로젝트 만들기 0605_BasicAttribute2
Button 위젯 5개 생성(버튼1, 버튼2, 버튼3, 버튼4, 버튼5)
<?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" tools:context=".MainActivity" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼1"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼2"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼3"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼4"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼5"/> </LinearLayout> |
< Visibility 속성 >
특정 위젯 또는 레이아웃의 표시 여부 설정(android:visibility="XXX")
1. visible : 위젯 또는 레이아웃 표시(기본값)
2. invisible : 위젯 또는 레이아웃 숨김. 단, 해당 위젯 또는 레이아웃의 위치는 그대로 보존
3. gone: 위젯 또는 레이아웃 숨김. 단, 해당 위젯 또는 레이아웃의 위치를 다른 위젯이 차지
> android:visibility="속성값"
- visible (디폴트값) invisible(버튼안보이고 자리차지) gone(버튼안보이고 자리차지X)
- 약관동의내용 같은 건 gone 으로 숨겨놨다가 보여야하기 때문에 그럴 때 쓰임!
# tip
android:clickable="false"
android:enabled="false"
- clickable / enabled 둘 다 클릭 안됨 ⇒ enabled 는 + 비활성화까지!
======== 새 프로젝트
p23
> 풀어보기
<?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" tools:context=".MainActivity" android:orientation="vertical" android:padding="10dp"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="버튼 1" android:textSize="30sp" android:layout_margin="20dp" android:background="#EFEFB2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="여긴 텍스트뷰입니다." android:textSize="20sp" android:layout_margin="20dp"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#3F51B5" android:layout_margin="20dp"/> <Button android:layout_width="wrap_content" android:layout_height="match_parent" android:text="버튼 2" android:textSize="30sp" android:enabled="false" android:layout_margin="20dp"/> </LinearLayout> |
- 실행화면
Ch4 - 28p
======== 0608_ch04_TextView_Basic 프로젝트 만들기
< TextView >
< 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" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text 속성"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="textSize 속성" android:textSize="30sp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="textColor 속성" android:textSize="30sp" android:textColor="#0000ff"/> </LinearLayout> |
- 손 안대면 normal이 디폴트!
- bold
- italic
- |
- deprecated 된 거 사용해볼거!
- android:singleLine="true"
- →
<?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" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text 속성"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="textSize 속성" android:textSize="30sp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="textColor 속성" android:textSize="30sp" android:textColor="#0000ff"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="textStyle 속성" android:textSize="30sp" android:textStyle="italic|bold"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="typeFace 속성" android:textSize="30sp" android:typeface="serif"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="singleLine 속성 singleLine 속성 singleLine 속성 singleLine 속성 singleLine 속성 singleLine 속성 singleLine 속성 singleLine 속성" android:textSize="30sp" android:singleLine="true"/> </LinearLayout> |
> TextView 3개 만들기(연습용)
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv1" android:text="TextView 연습1"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv2" android:text="TextView 연습2"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv3" android:text="TextView 연습3"/> |
< MainActivity.java >
- Ctrl + P 누르면 어떤 값을 넣어야하는지 나옴
package com.example.a0608_ch04_textview_basic; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // --------------- TextView 속성을 자바 코드에서 변경하기 ----------------- TextView tv1, tv2, tv3; tv1 = findViewById(R.id.tv1); tv2 = findViewById(R.id.tv2); tv3 = findViewById(R.id.tv3); // TextView 객체의 setXXX() 메서드를 호출하여 TextView 속성 변경 가능 // => XXX 은 레이아웃 파일(xml) 내의 속성명 tv1.setText("Hello, World!"); // 텍스트 변경 tv1.setTextColor(Color.RED); // 텍스트 색상 변경 tv1.setTextSize(40); tv2.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD_ITALIC); tv2.setTextSize(30); } } |
< SingleLine 속성 >
tv3.setText("SingleLine 속성 SingleLine 속성 SingleLine 속성 SingleLine 속성 SingleLine 속성 SingleLine 속성"); tv3.setTextSize(30); tv3.setSingleLine(); |
- 자바코드에서 이렇게 바꾸면 … 으로 생략 안해줌! 뒤에 안보임
- 차이점 잘 보기!
======== 0608_ch04_Button_EditTextBasic 새 프로젝트 만들기
< Button / EditText >
<?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" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:textSize="30sp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:textSize="30sp"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:textSize="30sp"/> </LinearLayout> |
- String text = et.getText().toString();
- 스트링객체로 형변환 필요
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // tv.setText("변경된 글자"); // EditText 위젯에 입력된 텍스트 가져오기 => String 타입 변수에 저장 String text = et.getText().toString(); // String타입으로 형변환필요! // Text tv.setText(text); } }); |
- EditText 에 글자입력 후 버튼 누르면 TextView 에 글자나타남!
< 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" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:id="@+id/tv" android:textSize="30sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:id="@+id/btn" android:textSize="30sp" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나는 어떤 위젯일까요?" android:textSize="30sp" android:id="@+id/et" android:singleLine="true"/> </LinearLayout> |
< MainActivity.java >
package com.example.a0608_ch04_button_edittextbasic; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView tv = findViewById(R.id.tv); final Button btn = findViewById(R.id.btn); final EditText et = findViewById(R.id.et); // 버튼을 클릭했을 때 EditText에 입력된 텍스트를 TextView에 출력 => 5단계 // 주의! 4단계 또는 5단계 이벤트 처리 시 내부 클래스에서 외부에 있는 변수에 접근할 경우 // 해당 변수에 final을 붙이거나, 멤버변수로 선언되어야 한다! btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // tv.setText("변경된 글자"); // EditText 위젯에 입력된 텍스트 가져오기 => String 타입 변수에 저장 String text = et.getText().toString(); // String 타입으로 형변환 필요! // TextView 위젯에 가져온 텍스트 출력 tv.setText(text); } }); } } |
======== 0608_ch04_p34_Exam_4_1 새로 만들기
> 문제 풀어보기(ch4 34페이지 4-1번 문제)
< 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" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="숫자1" android:id="@+id/Edit1" android:layout_margin="10dp"/> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="숫자2" android:id="@+id/Edit2" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="더하기" android:id="@+id/BtnAdd" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="빼기" android:id="@+id/BtnSub" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나누기" android:id="@+id/BtnDiv" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="곱하기" android:id="@+id/BtnMul" android:layout_margin="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="계산 결과 : " android:id="@+id/TextResult" android:layout_margin="10dp" android:textColor="#ff0000" android:textSize="30dp"/> </LinearLayout> |
< MainActivity.java >
package com.example.a0608_ch04_p34_exam_4_1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { EditText edit1, edit2; Button btnAdd, btnSub, btnMul, btnDiv; TextView textResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAdd = findViewById(R.id.BtnAdd); btnMul = findViewById(R.id.BtnMul); btnDiv = findViewById(R.id.BtnDiv); btnSub = findViewById(R.id.BtnSub); edit1 = findViewById(R.id.Edit1); edit2 = findViewById(R.id.Edit2); textResult = findViewById(R.id.TextResult); // Button 위젯 4개에 대한 이벤트 처리 btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 입력받은 숫자 2개 가져와서 정수로 변환 int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 + num2; textResult.setText("계산 결과 : " + result); } }); btnSub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 입력받은 숫자 2개 가져와서 정수로 변환 int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 - num2; textResult.setText("계산 결과 : " + result); } }); btnMul.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 입력받은 숫자 2개 가져와서 정수로 변환 int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 * num2; textResult.setText("계산 결과 : " + result); } }); btnDiv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 입력받은 숫자 2개 가져와서 정수로 변환 int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); // 나눗셈의 경우 두번째 피연산자가 0일 경우 ArithmeticException 발생 // => 따라서, 나눗셈 전 피연산자가 0인지 판별 필요 if(num1 > 0 && num2 > 0) { int result = num1 / num2; textResult.setText("계산 결과 : " + result); } else { // 하나라도 0이 입력됐을 경우 Toast 를 사용하여 에러 메세지 출력 textResult.setText("계산 결과 : 오류"); Toast.makeText(MainActivity.this, "숫자 입력 오류", Toast.LENGTH_SHORT).show(); } } }); } } |
- 이렇게 하면 문제가 발생함!
- 나누기에서 0으로 나눴을 경우 ArithmeticException 오류 발생!
> 해결방법
btnDiv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); if(num1 > 0 && num2 >0) { int result = num1 / num2; textResult.setText("계산 결과 : " + result); } else { textResult.setText("계산 결과 : 오류"); Toast.makeText(MainActivity.this, "숫자 입력 오류", Toast.LENGTH_SHORT).show(); } } }); |
- if 문 안에 따로 처리해줌
- Toast ⇒ 잠깐 띄우고 사라짐
- activity_main.xml 로 가서 디자인탭 누르고
- 숫자 1 에서 inputType 찾기
- 깃발모양 누른 후 number 체크해놓기!
- 숫자만 입력할 수 있게 바뀜!
- android:inputType="number”
- 코드가 간단하다!
> android:inputType="numberDecimal"
- double 타입도 가능! 소수점까지 적을 수 있다
< 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" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:id="@+id/Edit1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:includeFontPadding="false" android:inputType="number" android:text="숫자1" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="숫자2" android:id="@+id/Edit2" android:inputType="number" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="더하기" android:id="@+id/BtnAdd" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="빼기" android:id="@+id/BtnSub" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나누기" android:id="@+id/BtnDiv" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="곱하기" android:id="@+id/BtnMul" android:layout_margin="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="계산 결과 : " android:id="@+id/TextResult" android:layout_margin="10dp" android:textColor="#ff0000" android:textSize="30dp"/> </LinearLayout> |
< MainActivity.java >
package com.example.a0608_ch04_p34_exam_4_1; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { EditText edit1, edit2; Button btnAdd, btnSub, btnMul, btnDiv; TextView textResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAdd = findViewById(R.id.BtnAdd); btnMul = findViewById(R.id.BtnMul); btnDiv = findViewById(R.id.BtnDiv); btnSub = findViewById(R.id.BtnSub); edit1 = findViewById(R.id.Edit1); edit2 = findViewById(R.id.Edit2); textResult = findViewById(R.id.TextResult); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 + num2; textResult.setText("계산 결과 : " + result); } }); btnDiv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); if(num1 > 0 && num2 >0) { int result = num1 / num2; textResult.setText("계산 결과 : " + result); } else { textResult.setText("계산 결과 : 오류"); Toast.makeText(MainActivity.this, "숫자 입력 오류", Toast.LENGTH_SHORT).show(); } } }); btnSub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 - num2; textResult.setText("계산 결과 : " + result); } }); btnMul.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 * num2; textResult.setText("계산 결과 : " + result); } }); } } |
======== 0608_ch04_p42_self_4_3 만들기
> 42p 풀기
< 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" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:id="@+id/Edit1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:includeFontPadding="false" android:inputType="numberDecimal" android:hint="숫자1" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="숫자2" android:id="@+id/Edit2" android:inputType="numberDecimal" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="더하기" android:id="@+id/BtnAdd" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="빼기" android:id="@+id/BtnSub" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나누기" android:id="@+id/BtnDiv" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="곱하기" android:id="@+id/BtnMul" android:layout_margin="10dp"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="나머지값" android:id="@+id/BtnMod" android:layout_margin="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="계산 결과 : " android:id="@+id/TextResult" android:layout_margin="10dp" android:textColor="#ff0000" android:textSize="30dp"/> </LinearLayout> |
>> 지금까지는 5단계로 구현한 거고, 4단계 구현으로 바꿔보기!
View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { } }; // 4단계 리스너와 버튼 연결 btnAdd.setOnClickListener(listener); btnSub.setOnClickListener(listener); btnMul.setOnClickListener(listener); btnDiv.setOnClickListener(listener); btnMod.setOnClickListener(listener); |
- 4단계 기본 모양!
< requestFocus >
View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { // 숫자1, 숫자2 에 대한 입력 여부 체크 => 미입력 시 오류 메세지 출력 if(edit1.getText().toString().length() == 0) { // edit1.length() == 0 도 동일 Toast.makeText(MainActivity.this, "숫자1 입력 필수!", Toast.LENGTH_SHORT).show(); edit1.requestFocus(); // EditText 위젯 숫자1 입력 창에 커서 요청 } else if(edit2.length() == 0) { Toast.makeText(MainActivity.this, "숫자2 입력 필수!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); // EditText 위젯 숫자2 입력 창에 커서 요청 } } }; |
/ 버튼 여러개를 구별하기 위해서 onClick() 메서드의 파라미터 v 를 활용 if(v == btnAdd) { Toast.makeText(MainActivity.this, "덧셈!", Toast.LENGTH_SHORT).show(); } |
- if 문을 추가하여 버튼 구분하기 (리스너 안에 넣기)
- 확인을 위해 Toast 하나 띄우기
- 토스트 뜸
if(v == btnAdd) { // 입력받은 숫자 2개 가져와서 정수로 변환 int num1 = Integer.parseInt(edit1.getText().toString()); int num2 = Integer.parseInt(edit2.getText().toString()); int result = num1 + num2; textResult.setText("계산 결과 : " + result); } else if(v == btnSub) { } else if(v == btnDiv) { } else if(v == btnMul) { } else if(v == btnMod) { } |
- 버튼 구분 하기!
View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { // 숫자1, 숫자2 에 대한 입력 여부 체크 => 미입력 시 오류 메세지 출력 if(edit1.getText().toString().length() == 0) { // edit1.length() == 0 도 동일 Toast.makeText(MainActivity.this, "숫자1 입력 필수!", Toast.LENGTH_SHORT).show(); edit1.requestFocus(); // EditText 위젯 숫자1 입력 창에 커서 요청 } else if(edit2.length() == 0) { Toast.makeText(MainActivity.this, "숫자2 입력 필수!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); // EditText 위젯 숫자2 입력 창에 커서 요청 } // 버튼 여러개를 구별하기 위해서 onClick() 메서드의 파라미터 v 를 활용 // 1. if 문을 사용하여 변수 v 를 버튼 객체와 비교 if(v == btnAdd) { // 입력받은 숫자 2개 가져와서 실수로 변환 double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = num1 + num2; textResult.setText("계산 결과 : " + result); } else if(v == btnSub) { double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = num1 - num2; textResult.setText("계산 결과 : " + result); } else if(v == btnMul) { double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = num1 * num2; textResult.setText("계산 결과 : " + result); } else if(v == btnDiv) { double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = num1 / num2; textResult.setText("계산 결과 : " + result); } else if(v == btnMod) { double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = num1 % num2; textResult.setText("계산 결과 : " + result); } // 2. switch 문을 사용하여 변수 v 에 대한 id 값을 가져와서 버튼 위젯 아이디와 비교 } }; |
- 더블 타입으로 변경(소수점까지 처리하기 위해서)
- Integer.parseInt() 도 Double.parseDouble 로 바꿈
if(edit1.getText().toString().length() == 0) { // edit1.length() == 0 도 동일 Toast.makeText(MainActivity.this, "숫자1 입력 필수!", Toast.LENGTH_SHORT).show(); edit1.requestFocus(); // EditText 위젯 숫자1 입력 창에 커서 요청 return; } else if(edit2.length() == 0) { Toast.makeText(MainActivity.this, "숫자2 입력 필수!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); // EditText 위젯 숫자2 입력 창에 커서 요청 return; } |
- return 을 넣어줘야 오류 없이 다시 돌아감!
double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); if(v == btnAdd) { double result = num1 + num2; textResult.setText("계산 결과 : " + result); } else if(v == btnSub) { double result = num1 - num2; textResult.setText("계산 결과 : " + result); } else if(v == btnMul) { double result = num1 * num2; textResult.setText("계산 결과 : " + result); } else if(v == btnDiv) { double result = num1 / num2; textResult.setText("계산 결과 : " + result); } else if(v == btnMod) { double result = num1 % num2; textResult.setText("계산 결과 : " + result); } |
- 중복 된 코드는 바깥으로 빼준다
double num1 = Double.parseDouble(edit1.getText().toString()); double num2 = Double.parseDouble(edit2.getText().toString()); double result = 0; if(v == btnAdd) { result = num1 + num2; } else if(v == btnSub) { result = num1 - num2; } else if(v == btnMul) { result = num1 * num2; } else if(v == btnDiv) { result = num1 / num2; } else if(v == btnMod) { result = num1 % num2; } textResult.setText("계산 결과 : " + result); |
- 더 간결하게 줄일 수 있다!
- result 변수를 바깥으로 꺼내줘야 if 문 밖에서도 사용가능!
} else if(v == btnDiv) { result = num1 / num2; if(num2 == 0) { Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); return; } } else if(v == btnMod) { result = num1 % num2; if(num2 == 0) { Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); return; } } |
- 0으로 나눴을 경우 처리해주기
- return 을 해주면 else 문 안써도됨
> 나누기가 딱 맞아 떨어질 때 5.0 말고 5 라고 나오게끔 하고싶다!
// 연산 결과의 소수점 자리 부분 숫자가 0일 경우 .0 을 표시하지 않도록 출력문 수정 if(result%1==0) { // 소수점 자리 숫자가 0일 경우 textResult.setText("계산 결과 : " + (int)result); } else { // 소수점 자리 숫자가 0이 아닐 경우 textResult.setText("계산 결과 : " + result); } |
- 꼭 *10 %10 이라고 안하고, %1로 하면 소수점 구할 수 있다!
⇒ 코드 제일 밑으로 옮겨주기(전체 블럭 설정 후 Ctrl + Shift + 화살표)
> switch~case 문으로(정수형, 문자열, Enum 타입이 올수있다)
- btnAdd 라고하면 Button 타입이기 때문에 이렇게 가져오면 안됨!
- int 타입으로 가져오기(비교)
// 2. switch 문을 사용하여 변수 v 에 대한 id 값을 가져와서 버튼 위젯 아이디와 비교 // v.getId() == R.id.버튼위젯아이디 를 비교 switch (v.getId()) { // 안드로이드에서 사용하는 id 값을 int형이므로 switch 문 사용 가능 // case 문을 통해 각 버튼에 대한 id 값을 비교 case R.id.BtnAdd: result = num1 + num2; break; case R.id.BtnSub: result = num1 - num2; break; case R.id.BtnMul: result = num1 * num2; break; case R.id.BtnDiv: if(num2 == 0) { Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); return; } result = num1 / num2; break; case R.id.BtnMod: if(num2 == 0) { Toast.makeText(MainActivity.this, "0으로 나눌 수 없음!", Toast.LENGTH_SHORT).show(); edit2.requestFocus(); return; } result = num1 % num2; } |
'Dev.Program > Android' 카테고리의 다른 글
ScrollView / SlidingDrawer / ViewFlipper / WebView (0) | 2022.10.10 |
---|---|
TextView / ProgressBar / SeekBar / RatingBar (0) | 2022.10.10 |
Layout / Chronometer / TimePicker / DatePicker / CalendarView (0) | 2022.10.10 |
CheckBox / RadioButton / Toggle / ImageView (0) | 2022.10.10 |
Android Studio 설치 및 세팅 / jre 설정 (0) | 2022.10.10 |