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

fragment 질문이 있습니다

0 추천
간단하게 설명을 하자면 A_fragment에서 B_fragment로 이동해서 B_fragment에 있는 버튼을

사용해서 A_fragment에 있는 이미지를 변경 하려고 하는데요

 B_fragment에서 어떻게 해야 A_fragment에 있는 이미지를 변경할 수 있는지

모르겠어서 질문 드립니다

구글링을 잘 못했는지 안나오네요......
익명사용자 님이 2019년 7월 1일 질문

1개의 답변

0 추천

Activity에 public void setImage()라는 메서드를 만드시고,

setImage()라는 메서드는 A_fragment에 있는 public void changeImage()라는 메서드를 호출하세요.

B_fragment에서 Activity의 setImage를 호출하세요.

그러면 액티비티에서 A_fragment의 changeImage()를 호출, changeImage()에서 이미지 변경 코드를 넣으시면 됩니다.

B_fragment -> Activity 호출 -> Activity에서 A_fragment 호출 -> A_fragment에서 이미지 변경

 

아니면 Activity에 리스너를 등록해 두고, B프레그먼트에서 Activity의 리스너를 호출하는 방식으로 해도 됩니다.

 

구글에 fragment간 데이터 전달이라고 검색하시면 자료가 많이 나오네요

뱅구다 (11,280 포인트) 님이 2019년 7월 2일 답변
뱅구다님이 2019년 7월 2일 수정
알려주신대로 진행을 했습니다만 다음과 같은 애러가 출력되어서
문의 드립니다
Process: com.uninno.vibraoscillator, PID: 11209
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.uninno.vibraoscillator.Sub_Content_Main.changeImage()' on a null object reference
        at com.uninno.vibraoscillator.Sub_Activity_Main.setImage(Sub_Activity_Main.java:134)
        at com.uninno.vibraoscillator.Sub_activitySelection.Sub_Activity_arm1.onClick(Sub_Activity_arm1.java:290)
        at android.view.View.performClick(View.java:4764)
        at android.view.View$PerformClick.run(View.java:19844)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

액티비티에서 작성한 A_fragment를 호출 매서드
public void setImage(){
        FragmentManager fm = getSupportFragmentManager();
        Sub_Content_Main fragment = (Sub_Content_Main)fm.findFragmentById(R.id.sub_content_main);
        fragment.changeImage();
    }

B_Fragment에서 액티비티 호출 매소드

    @Override
    public void onClick(View v) {
        // Sub_Activity_Main의 setImage 매서드 호출
        ((Sub_Activity_Main)getActivity()).setImage();
        Fragment fragment = null;
        Log.d("Sub_test_Main","onClick:"+v.getId());
        switch(v.getId()) {

            // 자가 진단 테스트 버튼  클릭시 30초 뒤에 동작 멈춤
            case R.id.test:
                message9 = "w";
                if(message9 != null && message9.length() > 0)
                    sendMessage(message9);
                Log.d("testActivity","sendMessage : "+message9);
                CountDownTimer timer = new CountDownTimer(30000, 1000) { //제한시간동안 시간간격으로 줄어듦
                    //타이머가 종료 될 떄 까지 동작하는 onTick함수
                    @Override
                    public void onTick(long millisUntilFinished) {
                    }
                    //타이머가 종료될 때 실행되는 onFinish함수
                    @Override
                    public void onFinish() {
                        message9 = "t";
                        if(message9 != null && message9.length() > 0)
                            sendMessage(message9);
                        Log.d("testActivity","sendMessage : "+"종료 이벤트");
                    }
                };
                timer.start();
               break;
            case R.id.pain1:
                Sub_Content_Main.message1 = "q";
                Sub_Content_Main.pain = 1;
                Log.d("Sub_test_Main","button : "+Sub_Content_Main.message1);
                finger1.setVisibility(View.VISIBLE);
                finger2.setVisibility(View.INVISIBLE);
                finger3.setVisibility(View.INVISIBLE);
                finger4.setVisibility(View.INVISIBLE);
                finger5.setVisibility(View.INVISIBLE);
                finger6.setVisibility(View.INVISIBLE);

                break;

            case R.id.pain2:
                Sub_Content_Main.message1 = "q";
                Sub_Content_Main.pain = 1;
                Log.d("Sub_test_Main","button : "+Sub_Content_Main.message1);
                finger1.setVisibility(View.INVISIBLE);
                finger2.setVisibility(View.VISIBLE);
                finger3.setVisibility(View.INVISIBLE);
                finger4.setVisibility(View.INVISIBLE);
                finger5.setVisibility(View.INVISIBLE);
                finger6.setVisibility(View.INVISIBLE);
                break;

            case R.id.pain3:
                Sub_Content_Main.message1 = "w";
                Sub_Content_Main.pain = 2;
                Log.d("Sub_test_Main","button : "+Sub_Content_Main.message1);
                finger1.setVisibility(View.INVISIBLE);
                finger2.setVisibility(View.INVISIBLE);
                finger3.setVisibility(View.VISIBLE);
                finger4.setVisibility(View.INVISIBLE);
                finger5.setVisibility(View.INVISIBLE);
                finger6.setVisibility(View.INVISIBLE);
                break;

            case R.id.pain4:
                Sub_Content_Main.message1 = "e";
                Sub_Content_Main.pain = 3;
                Log.d("Sub_test_Main","button : "+Sub_Content_Main.message1);
                finger1.setVisibility(View.INVISIBLE);
                finger2.setVisibility(View.INVISIBLE);
                finger3.setVisibility(View.INVISIBLE);
                finger4.setVisibility(View.VISIBLE);
                finger5.setVisibility(View.INVISIBLE);
                finger6.setVisibility(View.INVISIBLE);

                break;

                case R.id.pain5:
                    Sub_Content_Main.message1 = "r";
                    Sub_Content_Main.pain = 4;
                Log.d("Sub_test_Main","button : "+Sub_Content_Main.message1);
                    finger1.setVisibility(View.INVISIBLE);
                    finger2.setVisibility(View.INVISIBLE);
                    finger3.setVisibility(View.INVISIBLE);
                    finger4.setVisibility(View.INVISIBLE);
                    finger5.setVisibility(View.VISIBLE);
                    finger6.setVisibility(View.INVISIBLE);
                break;

            case R.id.test_strat:
                select_main1.setVisibility(View.INVISIBLE);
                select_main2.setVisibility(View.VISIBLE);
                removeFragment(fragment);


                break;
            default:
                break;
        }
    }

다음과 같이 작성을 했는데 느낌상은 B_Fragment에서 액티비티를
호출하는 것이 잘못된것 같은데 정확하게 모르겠어서 문의 드립니다
...