오늘은 과거 안드로이드 스튜디오 수업을 들었을 때, 제출했던 텀프로젝트에 대해 기록해보고자 한다.
참고로 해당 앱은 예전에 만들어졌기에 난이도가 매우 쉽다. 나중에 보다 보완하고 기능을 추가해서 제대로 구현을 해보고자 한다.
사용한 기능은 이미 기존에 많이 언급한 것들이기에 오늘은 간단하게 xml, 자바코드로 설명을 하고자 한다. 참고로 수업은 자바코드로 배웠기에 이번 포스팅은 자바로 코드가 올라가지만, 보완할 프로젝트는 코틀린으로 제작할 예정이다:)
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"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView android:id="@+id/Text2"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="역사를 알아보기를 원하는 \n축구 구단은 무엇입니까?"
android:textSize="20dp"
android:layout_marginBottom="10dp"
android:visibility="visible" />
<RadioGroup android:id="@+id/Rgroup1"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible" >
<RadioButton android:id="@+id/madrid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="레알마드리드" />
<RadioButton android:id="@+id/mancity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="맨시티" />
<RadioButton android:id="@+id/paris"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="파리생제르망" />
<RadioButton android:id="@+id/bayern"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="바이에르 뮌헨" />
</RadioGroup>
<ImageView android:id="@+id/ImgMain"
android:layout_marginBottom="20dp"
android:layout_gravity="center"
android:layout_weight="0.8"
android:layout_width="256dp"
android:layout_height="256dp"
android:visibility="visible" />
<TextView android:id="@+id/TextResult"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="20dp"
android:visibility="invisible" />
<TextView android:id="@+id/TextResult1"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="어플 만족도 점수 : "
android:textSize="20dp"
android:visibility="invisible" />
<Button
android:id="@+id/ButtonNext"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/button_round"
android:text="역사 알아보기"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView android:id="@+id/Soccer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="30dp"
android:gravity="center"
android:visibility="visible" />
<Button
android:id="@+id/btnOk"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:src="@drawable/button_round"
android:layout_height="wrap_content"
android:text="역사 알아보기"
/>
<TextView
android:id = "@+id/History"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15dp"
android:visibility="invisible"
android:gravity="center"
/>
<ImageView
android:id="@+id/ImgSoccer"
android:layout_width="256dp"
android:layout_height="256dp"
android:layout_gravity="center"
android:visibility="visible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="해당 검색 결과에 대한 만족도 조사를 해주세요." />
<RatingBar
android:id="@+id/rbar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:backgroundTint="#C11515"
android:numStars="5"
android:stepSize="0.5">
</RatingBar>
<Button
android:id="@+id/btnReturn"
android:layout_gravity="center"
android:src="@drawable/button_round"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="되돌아가기" />
</LinearLayout>
이렇게 총 2개의 레이아웃만 사용한다! 그렇기에 아주 간단한 기능만을 가지고 있는 프로젝트임을 다시금 알 수 있다. 여기서, 나는 안드로이드 기본 버튼 모양이 너무 직사각형 그 자체라 조금 둥근 직사각형 형태를 유지할 수 있도록 drawble에 해당 shape를 등록한 뒤, xml에 이를 적용하였다. 이 작업이 제일 난이도가 있을 정도로 이 프로젝트는 매우 간단함을 알 수 있다! 사용한 shape에 대한 코드는 아래와 같다. 그러면 위의 버튼에 src를 이용하여 적용하면 된다!
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:padding="10dp"
android:shape="rectangle" >
<solid android:color="#57648C" />
<corners
android:bottomLeftRadius="12dp"
android:bottomRightRadius="12dp"
android:topLeftRadius="12dp"
android:topRightRadius="12dp" />
</shape>
그렇다면 자바코드에 대해 알아보자!
이미 수차례 이전 포스팅에서 인텐트(등) 사용했던 간단한 내용들이라 오늘은 코드만 기재하고자 한다. 버튼이벤트,인텐트가 이 코드에서 제일 어렵다고 볼 수 있다.(참고로 이 당시 나는 초보였기에 많이 어려워했다는...)
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
TextView textResult,textResult1;
RadioGroup rGroup1;
RadioButton rMadrid, rMancity, rParis, rBayern;
ImageView imgMain;
Button next;
String result,res;
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
String res = data.getStringExtra("history");
//textResult1.setText(res);
//second 창에서 출력된 역사를 첫페이지에서 잠깐 화면에 출력된 뒤, 사라짐.
textResult1.setVisibility(android.view.View.VISIBLE);
textResult1.setText("어플 만족도 점수 : ");
textResult1.append(res);
rGroup1.clearCheck();
textResult.setVisibility(android.view.View.INVISIBLE);
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//text1 = (TextView) findViewById(R.id.Text1);
textResult = (TextView) findViewById(R.id.TextResult);
textResult1 = (TextView) findViewById(R.id.TextResult1);
rGroup1 = (RadioGroup) findViewById(R.id.Rgroup1);
//축구 구단 보낼 변수 추가..?
rMadrid = (RadioButton) findViewById(R.id.madrid);
rMancity = (RadioButton) findViewById(R.id.mancity);
rParis = (RadioButton) findViewById(R.id.paris);
rBayern = (RadioButton) findViewById(R.id.bayern);
imgMain = (ImageView) findViewById(R.id.ImgMain);
imgMain.setImageResource(R.drawable.korea);
next =(Button) findViewById(R.id.ButtonNext);
result = " ";
setTitle("축구 구단 우승 역사 알아보기");
rGroup1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.madrid) {
textResult.setVisibility(android.view.View.VISIBLE);
textResult.setText(rMadrid.getText().toString() + "을 선택하셨습니다.");
result = "Real Madrid";
}
if (checkedId == R.id.mancity) {
textResult.setVisibility(android.view.View.VISIBLE);
textResult.setText(rMancity.getText().toString() + "을 선택하셨습니다.");
result = "Manchester City";
}
if (checkedId == R.id.paris) {
textResult.setVisibility(android.view.View.VISIBLE);
textResult.setText(rParis.getText().toString() + "을 선택하셨습니다.");
result = "Paris Saint-Germain";
}
if (checkedId == R.id.bayern) {
textResult.setVisibility(android.view.View.VISIBLE);
textResult.setText(rBayern.getText().toString() + "을 선택하셨습니다.");
result = "Bayern Munich";
}
}
});
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent inIntent = new Intent(getApplicationContext(), SecondActivity.class);
inIntent.putExtra("team",result); //세컨드 액티비티로 값을 보냄.
startActivityForResult(inIntent, 0);
}
});
}}
second 페이지로 이동한 뒤, 사용하는 자바코드는 이렇게 된다. 여기서 별점을 매기는 레이팅바, 인텐트 기능이 전부라 기본적인 설명은 생략하겠다.
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class SecondActivity extends AppCompatActivity {
TextView soccer; //첫페이지에서 선택한 축구 구단.
TextView history;
ImageView ImgSoccer; //축구 구단 이미지.
Button btnOk,btnReturn;
RatingBar rate;
float score;
String str;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secone);
setTitle("구단 역사");
Intent inIntent = getIntent(); //메인 엑티비티에서 값을 받아옴.
//final String result = String.valueOf(inIntent.getIntExtra("team", 0)); //첫페이지에서 선택받은
//라디오 버튼에 있는 값을 이용해서 밑의 코드를 작성함.
String result = inIntent.getStringExtra("team");
Button btnOk = (Button) findViewById(R.id.btnOk);
Button btnReturn = (Button) findViewById(R.id.btnReturn);
TextView soccer = (TextView) findViewById(R.id.Soccer);
TextView history = (TextView) findViewById(R.id.History);
ImageView imgSoccer = (ImageView) findViewById(R.id.ImgSoccer);
RatingBar rate = (RatingBar) findViewById(R.id.rbar1);
rate.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {//사용자 레이팅 바 조절 함수.
//Toast.makeText(getApplicationContext(),"New Rating: "+ rating, Toast.LENGTH_SHORT).show();
str = String.valueOf(rating);
//str = Float.toString(rating);
//textView2.setText(str);
//score = rating;
}
});
btnReturn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent outIntent = new Intent(getApplicationContext(), MainActivity.class);
outIntent.putExtra("history", str); //메인 엑티비티 한데 어플 만족도 점수를 보냄.
setResult(RESULT_OK, outIntent);
finish();
}
});
soccer.setText(result);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (TextUtils.equals(result, "Real Madrid")) {
history.setVisibility(View.VISIBLE);
imgSoccer.setVisibility(View.VISIBLE);
imgSoccer.setImageResource(R.drawable.realmadrid);
history.setText("스페인 라리가 35회, " + "코파 델 레이 19회, " + "UEFA 유러피언컵 및 챔피언스리그 14회, " +
"\n" + "스페인 슈퍼컵 12회, " +
"UEFA 슈퍼컵 5회, " + "FIFA 클럽월드컵 5회, " +
"\n" + " 인터컨티넨탈컵 3회, " + "UEFA컵 2회");
}
if (TextUtils.equals(result, "Manchester City")) {
history.setVisibility(View.VISIBLE);
imgSoccer.setVisibility(View.VISIBLE);
imgSoccer.setImageResource(R.drawable.mancity);
history.setText("프리미어 리그 2011-12 시즌, " + "2013-14 시즌, 2017-18 시즌, 2018-19 시즌, " +
"\n " + "2020-21 시즌, 2021-22, 2022-23, 잉글랜드 1부 리그 우승");
}
if (TextUtils.equals(result, "Paris Saint-Germain")) {//문자열 비교할 때, TextUtils.equals!! 이것으로 많이 해맸음.
history.setVisibility(View.VISIBLE);
imgSoccer.setVisibility(View.VISIBLE);
imgSoccer.setImageResource(R.drawable.paris);
history.setText("리그 1 11회, 리그 2 1회 우승, 쿠프 드 프랑스 14회, 쿠프 드 라 리그 9회, " +
"\n " +
"트로페 데 샹피옹 11회, 유럽 대항전 UEFA 컵위너스컵 1회, UEFA 인터토토컵1회");
}
if (TextUtils.equals(result, "Bayern Munich")) {
history.setVisibility(View.VISIBLE);
imgSoccer.setVisibility(View.VISIBLE);
imgSoccer.setImageResource(R.drawable.bayern);
history.setText("독일 축구 리그 최다 우승(33회), DFB-포칼 최다 우승(20회), " +
"\n " +
"리가포칼 최다 우승(6회), 그리고 DFL-슈퍼컵 최다 우승(10회)");
}
}
});
}
}
실행화면
이렇게 오늘은 과거 아주 초보였을 때, 했던 프로젝트를 다시금 살펴보았다. 지금보면 매우 쉬운 코드의 향연이지만, 이때 당시는 어렵고 힘들었던 기억이 난다... 이때 힘들었던 것은 왜 첫페이지에서 다음 페이지로 넘어가지 않는다는 간단한 오류였고, 이는 manifest에 등록만 하면 되는 아주~~ 간단한 문제였다. 이 글을 보는 초보들은 이런 실수를 하지 않기를 바란다... 아주 간단하지만, 오류도 안 뜨고 찾기 쉽지 않은 오류다....
'안드로이드 프로그래밍📱 > Projects📲' 카테고리의 다른 글
[Android Studio]배달의 민족 하단바 구현하기 with splash page, fade out (0) | 2025.03.19 |
---|---|
[AndroidStudio] 네비게이션을 활용하는 방법 with kotlin (0) | 2025.03.12 |
[Android Studio] 전자 액자 구현하기 (0) | 2025.02.14 |