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

onClick으로 설정한 멀티화면을 만드는 것에 오류가 있어 질문해봅니다.

0 추천
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E1DFDF"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical">

        <Button
            android:id="@+id/korea"
            android:layout_width="370dp"
            android:layout_height="70dp"
            android:layout_margin="25dp"
            android:layout_marginStart="25dp"
            android:gravity="center"
            android:text="한국 차트"
            android:onClick="myListener1"
            android:backgroundTint="#E85021"
            android:textColor="#FFFFFF" />

        <Button
            android:id="@+id/pop"
            android:layout_width="370dp"
            android:layout_height="70dp"
            android:layout_margin="25dp"
            android:layout_marginStart="25dp"
            android:gravity="center"
            android:text="POP 차트"
            android:onClick="myListener2"
            android:backgroundTint="#E85021"
            android:textColor="#FFFFFF" />

        <Button
            android:id="@+id/japan"
            android:layout_width="370dp"
            android:layout_height="70dp"
            android:layout_margin="25dp"
            android:layout_marginStart="25dp"
            android:gravity="center"
            android:text="일본 차트"
            android:onClick="myListener3"
            android:backgroundTint="#E85021"
            android:textColor="#FFFFFF" />

    </LinearLayout>
    <FrameLayout
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

</LinearLayout>

이런 xml파일에 버튼 3개가 있고, 각 버튼을 누르면 그 버튼에 맞는 새창이 뜨도록 만들려고 하는데,

 

public class CategoryActivity extends AppCompatActivity {

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

        // CategoryFragment를 화면에 표시합니다.
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentContainer, new HomeFragment())
                .commit();
    }

    public void myListener1(View view) {
        Intent intent = new Intent(getApplicationContext(), KoreaActivity.class);
        startActivity(intent);
    }

    public void myListener2(View view) {
        Intent intent = new Intent(getApplicationContext(), PopActivity.class);
        startActivity(intent);
    }

    public void myListener3(View view) {
        Intent intent = new Intent(getApplicationContext(), JapanActivity.class);
        startActivity(intent);
    }
}

이렇게 자바 파일이 있을때 onClick으로 설정해둔 버튼에 맞게 각각 설정된 class의 화면을 띄울려고 하는데 계속

/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.seeing, PID: 26529 java.lang.IllegalStateException: Could not find method myListener1(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton with id 'korea' at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:479) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:437) at android.view.View.performClick(View.java:7448) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1202) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 

이란 오류가 뜹니다...

public class KoreaActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.korea_layout);
    }
}

출력하게 할 자바에도 위 처럼 설정해 놨는데 왜 오류가 뜨는지 알 수가 없어 도움을 요청해 봅니다.

 

혹시 다른 코드도 필요하심 댓글로 달아드리겠습니다
제발 부탁드립니다!!

슐호 (140 포인트) 님이 2023년 6월 13일 질문

2개의 답변

0 추천
혹시 CategoryActivity안에 setContentView에 해당하는 코드만 남겨두고 button클릭부분도 XML과 액티비티에서 연결해제 하고 실행하면 어떻게 되는지 테스트해 보세요.
그래도 이슈가 있으면 theme을 체크해 보세요.
spark (227,530 포인트) 님이 2023년 6월 13일 답변
정확하진 않을 수 있지만 일단은 Fragment오류 같아 보이네요.
main인 기본 화면에 Fragment로 총 3개의 화면을 움직일 수 있는데 올리지 않은 1화면에선 토글버튼을 누르거나,위 코드인 3화면에선 새로운 화면을 띄우려고 버튼을 누르면 똑같이 강제종료되는 오류가 있네요.
혹시 방법을 아시나요???
에러가 나는 코드와 에러메세지를 올려보세요
코드 자체에는 오류가 뜨지 않지만
앱을 실행시키고 프래그먼트로 화면을 이동한 뒤, 각 버튼을 누르면 프래그먼트로 설정해 두지 않은 새로운 화면이 새창으로 뜨게 하려했지만
'한국 차드' 버튼을 누르는 순간
/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.seeing, PID: 26529 java.lang.IllegalStateException: Could not find method myListener1(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton with id 'korea' at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:479) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:437) at android.view.View.performClick(View.java:7448) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1202) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
이렇게 에러메세지가 뜨면서 바로 강제종료 되네요.

나머지 2개의 버튼도 똑같이 강제종료가 됩니다.
XML에 onClick을 삭제하시고 코드를 통해서 처리해도 같은지 확인해 보세여. 그리고 브레이크 포인트걸어서 디버깅도 해보시구요.
아주 혹시나 해서 그런데, 질문에 올리신 레이아웃이 category_layout이 맞는거죠?
네! 맨 위의 xml이 category_layout이 맞습니다.

그리고 category_layout의 onClick을 제거하면 버튼을 눌러도 강제종료가 되진 않지만 결국 화면전환은 되지 않네요.
그렇다는 건 xml에 연결된 onClick과 액티비티에 선언된 onClick간에 문제가 있다는 말인데, 올리신 코드로는 별 문제는 없어 보이지만, 웬지 프래그먼트의 레이아웃과도 연관이 있을 수 있을 것 같다는 생각이 드네요.
그럼, findViewById로  korea 버튼을 찾아서 onCllick이벤트를 코드로 할당해 보세요. findViewById로 해당 버튼을 못찾아서 에러가 날 가능성이 있어보이는데, 어떤지 한번 테스트해 보세요.

findViewById(R.id.korea).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick (View v) {
      // Intent를 생성할 때 첫번째 인자로 getApplicationContext() 쓰시지 말고  아래처럼 액티비티 인스턴스를 넘기세요. getApplicationContext를 사용하는 경우는 호출하는 액티비티가 없거나 할 때 사용할 수 있지만, 여기서는 그렇게 하시면 안될 것 같아요.
      Intent intent = new Intent(this.CategoryActivity, KoreaActivity.class);
      startActivity(intent);
   }
});
0 추천
이유를 알 것 같네요. Intent에 넘긴 getApplicationContext() 때문입니다. 보통의 경우는 액티비티 인스턴스를 넘기셔야 해요.
ApplicationContext를 넘길 경우는 Newtsk 라는 플래그도 같이 넘겨주셔야 합니다.
Intent  |  Android Developers - https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK
spark (227,530 포인트) 님이 2023년 6월 16일 답변
spark님이 2023년 6월 16일 수정
...