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

버튼 클릭 시 다른 액티비티 이미지 변경

0 추천

giftshop 액티비티에 있는 이미지 버튼을 누르면 main 액티비티로 화면 전환과 동시에 main 액티비티에 있는 이미지가 9초간 다른 이미지로 변경되는 코드를 작성하고 싶습니다.

제가 작성한 코드는 giftshop 액티비티의 이미지 버튼을 누르면, can 액티비티 (바뀔 이미지를 추가한 액티비티)로 화면 전환 후, 9초 뒤에 main 액티비티로 전환되게끔 했습니다.

어떻게 구현, 수정해야 할지 알려 주시면 감사하겠습니다 ㅠㅠ...

 

activity_giftshop.xml  (이미지 버튼)

<ImageButton
    android:id="@+id/can_button"
    android:layout_width="100dp"
    android:layout_height="125dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="40dp"
    android:layout_marginTop="170dp"
    android:background="@drawable/can_gift" />

 

GiftshopActivity.java

public class GiftshopActivity extends AppCompatActivity {

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

        //         ImageButton can_button = (ImageButton) findViewById(R.id.can_button);
        can_button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), CanActivity.class);
                startActivity(intent);
            }
        });

 

activity_can.xml  (변경할 이미지)

<ImageView
    android:id="@+id/can_cat"
    android:layout_width="1400dp"
    android:layout_height="1400dp"
    android:paddingRight="30dp"
    android:layout_centerInParent="true"/>

 

CanActivity.java

public class CanActivity extends AppCompatActivity {
    // 캔 고양이 움직이는 이미지
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_can);

        ImageView can = (ImageView) findViewById(R.id.can_cat);
        Glide.with(this).load(R.raw.can).into(can);


        // 이미지 출력 후 메인 화면으로 돌아감
        Handler hand = new Handler();
        hand.postDelayed(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                Intent i = new Intent(CanActivity.this, MainActivity.class);
                startActivity(i);
                finish();

            }
        }, 9000);

 

activity_main.xml  (메인 화면에 있는 이미지)

<ImageView
    android:id="@+id/maincat"
    android:layout_width="1400dp"
    android:layout_height="1400dp"
    android:layout_centerInParent="true"
    android:paddingRight="40dp" />

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

        // 메인 고양이 움직이는 이미지
        ImageView main_cat = (ImageView) findViewById(R.id.maincat);
        Glide.with(this).load(R.raw.main_cat).into(main_cat);

 

어쩔방구 (240 포인트) 님이 2022년 11월 8일 질문
startActivity를 호출할 때  getApplicationContext()를 사용하지 마세요. ApplicationContext는 앱 전체 범위를 가리키는 거라 적절하지 않습니다. 그냥 Activity의 context를 사용하세요.

1개의 답변

0 추천
 
채택된 답변

GiftshopActivity에서 MainActivty를 여시도록 하고 intent에 필요한 정보를 넘기세요. 그리고 CatActivity있는 handler코드를 MainActivity에 적용하시면 될 것 같은데요. 아래와 같은 구조가 될 것 같습니다. 테스트해 보시고 적절하게 수정해서 사용하세요.

public class ImageNavInfo implements Serializable {
     public static final BUNDLE_KEY = "ImageNavInfo";

     @DrawableRes
     private final int drawableId;
     private final long delayMillis;
   
     private ImageNavInfo(int drawableId,  long delayMillis;) {
         this.drawableId = drawableId;
         this.delayMillis = delayMillis;
     }

     // Getters 생략
     public static ImageNavInfo noDelay(int drawableId) {
           return new ImageNavInfo(drawableId, 0L);
     }

     public static ImageNavInfo longDelay(int drawableId) {
           return new ImageNavInfo(drawableId, 9000L);
     }
}

public class GiftshopActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        ...
        ImageButton can_button = (ImageButton) findViewById(R.id.can_button);
        can_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(this, MainActivity.class);
                intent.putSerializable(ImageNavInfo.BUNDLE_KEY, ImageNavInfo.longDelay(R.drawable.drwable_id);
                startActivity(intent);
            }
        });


public class MainActivity extends AppCompatActivity {

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

        ImageNavInfo imageNavInfo = (ImageNavInfo) getItent().getSerialzableExtra(ImageNavInfo.BUNDLE_KEY);
        if (imageNavInfo == null) 
           ImageNavInfo = ImageNavInfo.noDelay(R.drwable.default_drwabe_id);

        ImageView can = (ImageView) findViewById(R.id.can_cat);
        Glide.with(this).load(ImageNavInfo.drawableId).into(can);

        Handler hand = new Handler();
        hand.postDelayed(new Runnable() {
            @Override
            public void run() {
                ...
            }
        }, imageNavInfo.delayMillis);
     }
}

 

spark (227,470 포인트) 님이 2022년 11월 8일 답변
어쩔방구님이 2022년 11월 10일 채택됨
친절하게 답변해 주셔서 감사합니다! 추가 질문이 있는데

1. GiftshopActivity에서 Cannot resolve method 'putSerializable' in 'Intent', MainActivity에서 Cannot resolve method 'getSerialzableExtra' in 'Object' 오류가 나는데 어떻게 해결해야 할지 모르겠습니다,,,

2. MainActivity에서 바뀔 이미지가 activity_can 뿐 아니라 다른 activity도 있는데 어떻게 구현해야 할까요? 버튼이 여러개가 있고, 버튼마다 다른 이미지가 있습니다. 각 버튼을 눌렀을 때 MainActivity에서 바뀌었으면 좋겠습니다 ㅠ
1. 다른 API 호출시 에러는 모두 기억할 수 없기 때문에 해당 문서를 참조하시면 해야 합니다. API 문서에 가시면 Intent에 어떤 메소드와 필드가 있는지 확인이 가능합니다.
https://developer.android.com/reference/android/content/Intent

https://developer.android.com/reference/android/content/Intent#getSerializableExtra(java.lang.String,%20java.lang.Class%3CT%3E)
https://developer.android.com/reference/android/content/Intent#putExtra(java.lang.String,%20java.io.Serializable)
특히 마지막 링크들을 살펴보시면 어디가 잘못되었는지 금방 아실 수 있습니다.

2. 이건 단순히 자바 사용의 문제로 보입니다. 1번에서 어떻게 액티비티 간에 값을 넘기는지 해결이 되었기 때문에 버튼에 따라 다른 값을 사용해서 처리하시면 됩니다.
감사합니다!! 알려 주신 것처럼 해볼게요! 정말 감사함미당
...