[안드로이드 스튜디오] 갤러리 프로젝트(2) - 완성

이제·2021년 6월 6일
0
post-thumbnail

🍕 진행순서

  1. '투표 종료' 눌렀을 때 두 번째 Activity로 넘어가게 하기
  2. 그림 하나하나 눌렀을 때 별점 올라가도록 코드 작성
  3. 두 번째 Activity로 넘어갔을 때 2번에서 점수를 기록했던 내용을 전달받을 수 있도록 Intent 작성해주고 두 번째 Activitiy에서 꺼내오기

--> 현재 1. '투표 종료' 눌렀을 때 두 번째 Acitivity로 넘어가게 하기까지 완료한 상태

💌 2. 그림 하나하나 눌렀을 때 별점 올라가도록 코드 작성

🔹 MainActivity.java

package com.cookandroid.w11_gallery;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

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

        Button bt = (Button) findViewById(R.id.btnResult);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, ResultActivity.class);
                startActivity(intent);
            }
            //정수를 저장할 수 있는 박스 9개를 만들어놓고 0으로 초기화
            int rating[] = new int[9];
            //원래 하던 것 : ImageView iv; --> iv = (ImageView) findViewById (R.id.iv)
            ImageView image[] = new ImageView[9];

            Integer image_id[] = {R.id.iv1, R.id.iv2, R.id.iv3,
                    R.id.iv4, R.id.iv5, R.id.iv6,
                    R.id.iv7, R.id.iv8, R.id.iv9};

            for (int i=0; i<9; i++){

                rating[i] = 0;
                //캐스팅 하던 대로. ImageView img(변수) = (ImageView) findViewByID (R.id.--)
                image[i] = (ImageView) findViewById(image_id[i]);

                //final - 한 번 할당한 뒤 다시는 값을 바꾸지 않아야 할 경우에.(실수로라도 바꾸지 않게. 안전장치.)
                final int j = i;
                image[i].setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        rating[j]++;
                    }
                });
            }

        });
    }
}

💌 3. 두 번째 Activity로 넘어갔을 때 2번에서 점수를 기록했던 내용을 전달받을 수 있도록 Intent 작성해주고 두 번째 Activitiy에서 꺼내오기

  • 💫 MainActivity.java - Intent 작성 _ putExtra

package com.cookandroid.w11_gallery;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

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


        //정수를 저장할 수 있는 박스 9개를 만들어놓고 0으로 초기화
        int rating[] = new int[9];
        //원래 하던 것 : ImageView iv; --> iv = (ImageView) findViewById (R.id.iv)
        ImageView image[] = new ImageView[9];

        Integer image_id[] = {R.id.iv1, R.id.iv2, R.id.iv3,
                R.id.iv4, R.id.iv5, R.id.iv6,
                R.id.iv7, R.id.iv8, R.id.iv9};

        for (int i = 0; i < 9; i++) {

            rating[i] = 0;
            //캐스팅 하던 대로. ImageView img(변수) = (ImageView) findViewByID (R.id.--)
            image[i] = (ImageView) findViewById(image_id[i]);

            //final - 한 번 할당한 뒤 다시는 값을 바꾸지 않아야 할 경우에.(실수로라도 바꾸지 않게. 안전장치.)
            final int j = i;
            image[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    rating[j]++;
                }
            });
        }

        Intent intent = getIntent();
        int r[] = intent.getIntArrayExtra("rating");

        Button bt = (Button) findViewById(R.id.btnResult);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, ResultActivity.class);

                //intent 내용 전달할 때 putExtra 사용.(내용 꺼낼 때 - getExtra)
                intent.putExtra("rating", rating);
                startActivity(intent);
            }

        });
    }
}
  • 💫 ResultActivity.java - Intent 작성 _ getExtra

package com.cookandroid.w11_gallery;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ResultActivity extends Activity {

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

        //인텐트 가져와서 사용
        Intent intent = getIntent();
        int r[] = intent.getIntArrayExtra("rating");

	RatingBar br[] = new RatingBar[9];
        Integer br_id[] = {R.id.rbar1, R.id.rbar2, R.id.rbar3, R.id.rbar4,
                R.id.rbar5, R.id.rbar6, R.id.rbar7, R.id.rbar8, R.id.rbar9};

        for (int i=0; i<9; i++){
            br[i] = (RatingBar) findViewById(br_id[i]);
            br[i].setRating((float)r[i]);
        }

        Button bt = (Button) findViewById(R.id.btnReturn);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

}

4. 토스트메시지 띄우기까지 최종완성

  • 💫 MainActivity.java

package com.example.w11_rating;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity  {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //제목을 변경해줍니다.
        setTitle("명화 선호도 투표");

        //그림 9개의 별점을 저장할 정수형 배열 선언하고
        int voteCount[] = new int[9];
        // 모든 값을 0으로 초기화 합니다.
        for (int i = 0; i < 9; i++)
            voteCount[i] = 0;

        // 9개의 이미지뷰를 담을 이미지뷰의 어레이를 선언합니다.
        ImageView image[] = new ImageView[9];
        // 이미지뷰 각각의 ID를 담은 배열을 선언합니다.
        // 실제 저장중인 값은 정수형이기때문에 Integer로 선언합니다.
        Integer imageId[] = { R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5,
                R.id.iv6, R.id.iv7, R.id.iv8, R.id.iv9 };

        // 각 이미지의 이름을 저장하는 배열을 선언합니다.
        String imgName[] = { "독서하는 소녀", "꽃장식 모자 소녀", "부채를 든 소녀",
                "이레느깡 단 베르양", "잠자는 소녀", "테라스의 두 자매", "피아노 레슨", "피아노 앞의 소녀들",
                "해변에서" };

        // 반복문을 이용해서 이미지뷰에 xml코드 내의 위젯을 맵핑해줍니다.
        // 그리고 클릭리스너를 설정합니다.
        // 클릭리스너는 모든 뷰에 대해서 설정 가능합니다 :)
        for (int i = 0; i < imageId.length; i++) {

            // 왜 이게 final이어야 하는지는 수업에서 말씀드리겠습니다.
            final int index = i;
            image[i] = (ImageView) findViewById(imageId[i]);
            image[i].setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    // 클릭을 받은 그림의 평점을 1 증가시킵니다.
                    voteCount[index]++;

                    // 그리고 내가 수행한 결과를 토스트로 화면에 출력해줍니다.
                    Toast.makeText(getApplicationContext(),
                            imgName[index] + ": 총 " + voteCount[index] + " 표",
                            Toast.LENGTH_SHORT).show();

                }
            });
        }

        // 결과를 나타내는 activity로 넘어가는 버튼을 작성합니다.
        Button btnFinish = (Button) findViewById(R.id.btnResult);
        btnFinish.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //intent 를 생성합니다.
                Intent intent = new Intent(getApplicationContext(),
                        ResultActivity.class);

                // ResultActivity 로 전달할 내용을 putExtra함수로 저장합니다.
                // 이름은 getExtra에서 데이터를 꺼낼 때 사용합합니다.
                intent.putExtra("VoteCount", voteCount);
                intent.putExtra("ImageName", imgName);

                //ResultActivity를 실행합니다.
                startActivity(intent);
            }
        });

    }
}
  • 💫 ResultActivity.java

package com.example.w11_rating;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.TextView;

public class ResultActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 결과를 나타내는 레이아웃을 지정합니다.
        setContentView(R.layout.result);
        // 제목을 설정합니다.
        setTitle("투표 결과");

        // MainActivity 에서 보낸 intent 를 받아옵니다.
        Intent intent = getIntent();

        // get~~~~~ 함수를 이용해서 데이터를 받아옵니다.
        int[] voteResult = intent.getIntArrayExtra("VoteCount");
        String[] imageName = intent.getStringArrayExtra("ImageName");

        // 9개의 TextView, RatingBar 를 담을 배열을 선언하고,
        TextView tv[] = new TextView[imageName.length];
        RatingBar rbar[] = new RatingBar[imageName.length];

        // 9개의 TextView, RatingBar 를 할당할 때 사용할 ID 배열을 만들어줍니다.
        // tvID는 intent로 받아와도 좋습니다.
        Integer tvID[] = { R.id.tv1, R.id.tv2, R.id.tv3, R.id.tv4, R.id.tv5,
                R.id.tv6, R.id.tv7, R.id.tv8, R.id.tv9 };
        Integer rbarID[] = { R.id.rbar1, R.id.rbar2, R.id.rbar3, R.id.rbar4,
                R.id.rbar5, R.id.rbar6, R.id.rbar7, R.id.rbar8, R.id.rbar9 };

        // TextView, RatingBar 에 위젯을 찾아다가 맵핑해줍니다.
        for (int i = 0; i < voteResult.length; i++) {
            tv[i] = (TextView) findViewById(tvID[i]);
            rbar[i] = (RatingBar) findViewById(rbarID[i]);
        }

        // 각 TextVeiw 및 RatingBar에 넘겨 받은 값을 반영해줍니다.
        // 별점을 반할때에는 setRating 함수를 영사용합니다.
        for (int i = 0; i < voteResult.length; i++) {
            tv[i].setText(imageName[i]);
            rbar[i].setRating((float) voteResult[i]);
        }

        // 돌아가기 버튼에 finish() 함수를 실행하도록 해서
        // 현재 activity를 종료할 수 있도록 합니다.
        Button btnReturn = (Button) findViewById(R.id.btnReturn);
        btnReturn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                finish();

            }
        });

    }
}


profile
알아가는 맛

0개의 댓글