Android Studio를 활용한 안드로이드 프로그래밍 직접 풀어보기 P233 5-5
테이블레이아웃으로 작성한 계산기 프로그램을 그리드 레이아웃으로 변경하여 실행하기
XML코드
테이블레이아웃과 그리드 레이아웃을 각각 화면에 꼭 맞춰서 보이게하는 방법은 다릅니다.
일반적으로 각 버튼의 간격조절없이 코드를 작성하면 테이블 레이아웃, 그리드 레이아웃 둘다 오른쪽 화면이 짤리는데 해결방법은 다음과 같습니다.
테이블 레이아웃: 모든 버튼의 layout_weight을 1로 설정한다.
그리드 레이아웃: 위젯의 사이즈(width,height)를 "직접" 지정한다.
그렇기 때문에 화면짤림을 방지하기 위해 직접 각 위젯의 사이즈를 지정했습니다.
각 숫자버튼을 80dp로 지정했을 때 가장 적당했고 그렇기 때문에연산버튼은 80*5=400dp가 적당했습니다.
4개의 연산버튼은 하나의 버튼만 400dp로 지정해두면 나머지 버튼들이 지정해둔 사이즈로 자동 변환됩니다.
이것만 주의하면 테이블레이아웃으로 구현한것과 별로 다를 게 없습니다.
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnCount="5"
android:rowCount="9">
<EditText
android:layout_column="0"
android:layout_row="0"
android:id="@+id/edit1"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:hint="숫자1입력" />
<EditText
android:layout_column="0"
android:layout_row="1"
android:id="@+id/edit2"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:hint="숫자1입력"/>
<Button
android:layout_column="0"
android:layout_row="2"
android:id="@+id/btn0"
android:text="0"
android:layout_width="80dp"
/>
<Button
android:layout_column="1"
android:layout_row="2"
android:id="@+id/btn1"
android:text="1"
android:layout_width="80dp"
/>
<Button
android:layout_column="2"
android:layout_row="2"
android:id="@+id/btn2"
android:text="2"
android:layout_width="80dp"
/>
<Button
android:layout_column="3"
android:layout_row="2"
android:id="@+id/btn3"
android:text="3"
android:layout_width="80dp"
/>
<Button
android:layout_column="4"
android:layout_row="2"
android:id="@+id/btn4"
android:text="4"
android:layout_width="80dp"
/>
<Button
android:layout_column="0"
android:layout_row="3"
android:id="@+id/btn5"
android:text="5"
android:layout_width="80dp"
/>
<Button
android:layout_column="1"
android:layout_row="3"
android:id="@+id/btn6"
android:text="6"
android:layout_width="80dp"
/>
<Button
android:layout_column="2"
android:layout_row="3"
android:id="@+id/btn7"
android:text="7"
android:layout_width="80dp"
/>
<Button
android:layout_column="3"
android:layout_row="3"
android:id="@+id/btn8"
android:text="8"
android:layout_width="80dp"
/>
<Button
android:layout_column="4"
android:layout_row="3"
android:id="@+id/btn9"
android:text="9"
android:layout_width="80dp"
/>
<Button
android:layout_column="0"
android:layout_row="4"
android:id="@+id/btnAdd"
android:layout_margin="5dp"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:layout_width="400dp"
android:text="더하기" />
<Button
android:layout_column="0"
android:layout_row="5"
android:id="@+id/btnMin"
android:layout_margin="5dp"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:text="빼기"
/>
<Button
android:layout_column="0"
android:layout_row="6"
android:id="@+id/btnMul"
android:layout_margin="5dp"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:text="곱하기"
/>
<Button
android:layout_column="0"
android:layout_row="7"
android:id="@+id/btnDiv"
android:layout_margin="5dp"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"
android:text="나누기" />
<TextView
android:layout_column="0"
android:layout_row="8"
android:id="@+id/textRes"
android:layout_margin="5dp"
android:text="계산결과: "
android:textColor="#FF0000"
android:textSize="20sp"
android:layout_columnSpan="5"
android:layout_gravity="fill_horizontal"/>
</GridLayout>
MainActivity
index를 final형으로 선언하는 이유는 지역변수로 선언 시 아래의 익명클래스에서 인식을 못하기 때문입니다.
그리고 아래와 같은 코드를통해 입력받은수와 번호버튼으로 입력한 숫자가 합쳐집니다.
ex) 80입력 후 9버튼 클릭=> 809
num1=edit1.getText().toString()+numButtons[index].getText().toString();
package com.example.practice5_5;
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,btnMin,btnMul,btnDiv;
TextView textRes;
String num1,num2;
Integer res;
Button[] numButtons=new Button[10];
Integer[] numBtnIds={R.id.btn0,R.id.btn1,R.id.btn2,R.id.btn3,R.id.btn4,R.id.btn5,
R.id.btn6,R.id.btn7,R.id.btn8,R.id.btn9};
int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("그리드레이아웃 계산기");
edit1=(EditText) findViewById(R.id.edit1);
edit2=(EditText) findViewById(R.id.edit2);
btnAdd=(Button)findViewById(R.id.btnAdd);
btnMin=(Button)findViewById(R.id.btnMin);
btnMul=(Button)findViewById(R.id.btnMul);
btnDiv=(Button)findViewById(R.id.btnDiv);
textRes=(TextView)findViewById(R.id.textRes);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
num1=edit1.getText().toString();
num2=edit2.getText().toString();
res=Integer.parseInt(num1)+Integer.parseInt(num2);
textRes.setText("계산결과: "+res.toString());
}
});
btnMin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
num1=edit1.getText().toString();
num2=edit2.getText().toString();
res=Integer.parseInt(num1)-Integer.parseInt(num2);
textRes.setText("계산결과: "+res.toString());
}
});
btnMul.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
num1=edit1.getText().toString();
num2=edit2.getText().toString();
res=Integer.parseInt(num1)*Integer.parseInt(num2);
textRes.setText("계산결과: "+res.toString());
}
});
btnDiv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
num1=edit1.getText().toString();
num2=edit2.getText().toString();
res=Integer.parseInt(num1)/Integer.parseInt(num2);
textRes.setText("계산결과: "+res.toString());
}
});
for(i=0;i<numBtnIds.length;i++)
numButtons[i]=(Button)findViewById(numBtnIds[i]);
for(i=0;i<numBtnIds.length;i++)
{
final int index;
index=i;
numButtons[index].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(edit1.isFocused()==true)
{
num1=edit1.getText().toString()+numButtons[index].getText().toString();
edit1.setText(num1);
}
else if(edit2.isFocused()==true)
{
num2=edit2.getText().toString()+numButtons[index].getText().toString();
edit2.setText(num2);
}
else
{
Toast.makeText(getApplicationContext(),"선택하세요..",Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
'Android Studio를 활용한 안드로이드 프로그래밍' 카테고리의 다른 글
직접 풀어보기 6-2 (2) | 2020.05.04 |
---|---|
직접 풀어보기 6-1 (1) | 2020.05.03 |
직접 풀어보기 5-4 (0) | 2020.05.03 |
직접 풀어보기 5-3 (0) | 2020.05.03 |
직접 풀어보기 5-2 (0) | 2020.05.03 |