마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 스피너 이미지 클릭 메서드 도와주세요 ㅠㅠ!!

0 추천

스피너로 클릭한 이미지가 크게 보이면서 그 이미지를 클릭하면 그 이미지에 알맞는 각기 다른 액티비티로 넘어가게 만들고 싶은데 다른 이미지를 클릭 했을때 다른 액티비티 호출을 어떤식으로 어떻게 만들어야 할지 도통감이 안잡힙니다.. 여행지 추천 어플이고 액티비티 이름은 Indonesia Japan Switzerland 이런식으로 되있습니다.. 

신희 (180 포인트) 님이 2022년 12월 1일 질문
신희님이 2022년 12월 1일 수정

1개의 답변

+1 추천
 
채택된 답변

국기를 클릭하면 해당 국가의 디테일을 보여주는 화면으로 이동하고 싶으신 건가요?

이게 맞다는 전제로 답을 달게요.

먼저 국가 디테일을 보여주는 액티비티는 CountryDetailsActivity처럼 하나만 만드시고, 선택한 나라에 따른 디테일을 가져와서 동적으로 보여주도록 하는게 적합한 접근방법입니다. 전세계에 수많은 나라가 있을 텐데, 모든 나라에 해당하는 액티비티를 만드는건 너무 비효율적입니다.

가능하면 화면 중심이 아니라 데이터 중심으로 사고를 하시면 해결방이 쉽게 찾아집니다. 즉, 리스트 보여주는 뷰보다 뷰에 제공되어지는 국가데이터를 먼저 설계합니다. List<Country>처럼요. 그리고 리스트 아이템을 클릭할 때 List<Country>에서 클릭한 포지션에 해당하는 Country를 액티비티에 넘겨줍니다.

Country클래스를 설계합니다. 필드는 본인 입맞에 맞게 수정해서 사용하세요.

// Country 인스턴스를 다른 액티비티로 전달하려면 
// Intent에는 Serializable이나 Parcelable형태의 커스텀 오브젝트만 넘길 수 있기 때문에 Serializable이 꼭 필요함. 
public class Country implements Serializable {
    private final String id;
    private final String name;
    private final int photoResId;

    public Country(String id, String name, int photoResId) {
        this.id = id;
        this.name = name;
        this.photoResId = photoResId;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getPhotoResId() {
        return photoResId;
    }

    // 만약 스피너에 ArrayAdapter를 사용했다면 toString을 오버라이드 해서 화면에 보여줄 값을 변경할 수 있음.
   @Override
    public String toString() {
        return name;
    }
}

 

스피너가 있는 액티비티에서 스피너에 보여줄 countryList를 가져오도록 하고 이걸 어댑터에 보여줍니다. 그리고 스피너 클리시 이 countryList 클릭한 Country를 가져와서 CountryDetailsActivity에 전달합니다.

public class CountryActivity extends AppCompatActivity {

    private ImageView placePicture;
    private Country selectedCountry;

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

        setupPlacePicture();
        setupCountrySpinner();
    }

    private void setupPlacePicture() {
        placePicture = findViewById(R.id.placePicture);
        placePicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CountryDetailsActivity.show(CountryActivity.this, selectedCountry);
            }
        });
    }

    private void setupCountrySpinner() {
        Spinner spinner = findViewById(R.id.spinner);

        List<Country> countryList = getCountryList();
        ArrayAdapter<Country> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, countryList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if (position < 1) return;
                selectedCountry = countryList.get(position);
                showBgPhoto();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }

    private void showBgPhoto() {
        placePicture.setImageResource(selectedCountry.getPhotoResId());
    }

    private List<Country> getCountryList() {
        // 필요한 코드를 구현할 것
    }
}



public class CountryDetailsActivity extends AppCompatActivity {

    private static final String COUNTRY = "Country";

    public static void show(Context context, Country country) {
        Intent intent = new Intent(context, CountryDetailsActivity.class);
        intent.putExtra(COUNTRY, country);
        context.startActivity(intent);
    }

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

    private void bindCountry() {
        Country country = (Country) getIntent().getSerializableExtra(COUNTRY);
        Objects.requireNonNull(country);
        // 필요한 처리
    }
}

 

필요에 따라서는  Country selectedCountry대신 int selectedPosition을 멤버변수로 사용하실 수도 있습니다.

 

spark (226,420 포인트) 님이 2022년 12월 1일 답변
신희님이 2022년 12월 1일 채택됨
감사합니다 !! 좋은 피드백인거 같습니다 선생님 방향으로 절 하겠습니다!!
...