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

AppCompatActivity에서 Fragment로 문자열 전달하는 방법?

0 추천

자바 파일이 3개가 있습니다.

1. MainActivity.java -> Fragment.java를 먼저 실행함.

2. Fragment.java    -> 버튼을 클릭하여 Characteristic.java(팝업창)을 화면에 띄움

3. Characteristic.java  -> 리스트가 나타나는데, 리스트 클릭시에 dialog 창을 띄우고, dialog 창에서 버튼을 클릭하면 문자열을 다시 Fragment로 돌려보냅니다. 문자열은 onResume에서 받습니다.

(팝업창을 활성화시키는 시점에서, Fragment의 onCreate나 onCreateView는 이미 만들어져 있기 때문에 여기서 문자열을 받을 수 없고, 팝업창이 꺼지는 시점에서 Fragment의 onStart, onResume이 먼저 동작합니다.)

대충 이런 순서로 진행을 하려고 하는데요.

문자열을 보내는걸 어떻게 해야할지 고민입니다...

Bundle로 해봤는데, 인식을 못하는 것 같더라구요..(제 생각에는 MainActivity에서 Fragment를 시작할 때, Bundle을 한번 사용하는데, 이것 때문이 아닌가 하는 생각이 듭니다.)

Fragment.java

public class Fragment extends Fragment {
}

 

Characteristic.java

public class FlashCharView extends AppCompatActivity {
}

 

 

 

(Fragment에서 리스트 클릭시에 dialog 창을 보여주는 코드입니다.)

ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        String selectedNumber = ((TextView)view.findViewById(R.id.flash_list_number)).getText().toString();

        queryshow(selectedNumber);
    }
});

(dialog(queryshow)창에서 yes 버튼을 클릭할 때, selectedNumber를 Fragment로 보내려는 코드입니다.)

public void queryshow(String selectedNumber){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("값 전송?");
    builder.setMessage("   번호 :  " + selectedNumber);
    builder.setPositiveButton("YES",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //  ????
                    finish();
                }
            });
    builder.setNegativeButton("NO",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });
    final AlertDialog dialog = builder.create();
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface arg0) {
            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.RED);
            dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.RED);
        }
    });
    dialog.show();
}
걍 취미로 (230 포인트) 님이 2022년 8월 11일 질문

2개의 답변

0 추천
Frgament에서  queryShow에 리스너를 넘기세요.
제가 모발폰이라 코드는 작성하기기 힘드네요.
spark (226,420 포인트) 님이 2022년 8월 12일 답변
0 추천

queryShow메소드에  리스너를 추가하세요.

public interface QueryShowListener {
     void onQueryEntered(String query);
     void onQueryCancelled();
}


public void showQueryDialog(String selectedNumber, QueryShowListener listener){
    ...
    builder.setPositiveButton("YES",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                    listener.onQueryEntered(selectedNumber);
                    finish();
                }
            });
    builder.setNegativeButton("NO",
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                      listener.onQueryCancelled();
                }
            });
    ...
}

 

그리고 호출하는 쪽에서는 리스너를 넘겨주시면 됩니다.

ListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        String selectedNumber = ((TextView)view.findViewById(R.id.flash_list_number)).getText().toString();

        showQueryDialog(selectedNumber, new QueryShowListener() {
                @Override
                public void onQueryEntered(String query) {
                     // Do whatever you want...
               }
               
               @Override
               public void onQueryCancelled() {
                      // Do whatever you want...
               }
        });
    }
})

 

 

spark (226,420 포인트) 님이 2022년 8월 15일 답변
spark님이 2022년 8월 15일 수정
답변 감사합니다. 그런데 조금 잘못 이해하신 것 같아요.. queryshow에 대한 코드는, Fragment.java에 있는 코드입니다. 저는 dialog에서 나타나는 값을 Fragment.java 에서 받으려는게 아니고, Characteristic.java에서 selectedNumber 값을 받으려고 합니다..
그것도 마찬가지로 Characteristic.java가 QueryShowListener를 구현하게 하신 다음 Fragment.onAttatch에서 리스너를 받아서 showQueryDialog로 넘기세요.

public class Characteristic extends AppCompatActivity implements ShowQueryListener {
}

https://developer.android.com/reference/androidx/fragment/app/Fragment.html#onAttach(android.content.Context)

private ShowQueryListener queryListener;

@Override
public void onAttach(Context context) {
     super.onAttach(context);
     queryListener = (ShowQueryListener) context;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
    ...
    showQueryDialog(selectedNumber, listener);
}
참고로 Java class랑 파일명이랑 똑같이 사용하시길 바랍니다.
...