안드로이드 Fragment관련 질문드립니다.

조회수 1149회
public class MovieDetailFragment extends Fragment {
TextView likeCountView;
TextView hateCountView;
Button allViewButton;
ViewGroup rootView;

boolean likeState = false;
boolean hateState = false;

ArrayList<CommentItems> items;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.movie_detail_fragment, container, false);

    ListView listView = rootView.findViewById(R.id.listView);
    items = new ArrayList<CommentItems>();
    items.add(new CommentItems("kim78**", 5, "적당히 재밌다. 오랜만에 잠 안오는 영화 봤네요.", R.drawable.user1));
    listViewAdapter adapter = new listViewAdapter(items);
    listView.setAdapter(adapter);

    TextView writeButton = rootView.findViewById(R.id.button_write);
    allViewButton = rootView.findViewById(R.id.button_allView);


    //모두보기 버튼
    allViewButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                    ((MainActivity) getActivity()).commentWriteViewReplace();
                }
            }
        }
    });

    //작성하기 버튼
    writeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((MainActivity) getActivity()).commentWriteViewReplace();
        }
    });

    return rootView;
}


public class listViewAdapter extends BaseAdapter {
    final ArrayList<CommentItems> items;

    public listViewAdapter(ArrayList<CommentItems> items) {
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final int pos = position;
        final Context context = parent.getContext();

        // "listview_item" Layout을 inflate하여 convertView 참조 획득.
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.comment_item, parent, false);
        }

        // 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
        TextView id = convertView.findViewById(R.id.textview_id);
        RatingBar ratingBar = convertView.findViewById(R.id.ratingBar);
        ImageView proFileImage = convertView.findViewById(R.id.imageView_proFile);
        TextView commentText = convertView.findViewById(R.id.textview_commenttext);

        // Data Set(listViewItemList)에서 position에 위치한 데이터 참조 획득
        CommentItems item = items.get(position);

        // 아이템 내 각 위젯에 데이터 반영
        id.setText(item.getId());
        ratingBar.setRating(item.getRating());
        proFileImage.setImageResource(item.getResId());
        commentText.setText(item.getComment());


        return convertView;
}
}

============================================================================

public void allCommentViewReplace() {
    getSupportFragmentManager().beginTransaction().replace(R.id.container, allCommentView).addToBackStack(null).commit();
}

public void commentWriteViewReplace() {
    getSupportFragmentManager().beginTransaction().replace(R.id.container, commentWriteView).addToBackStack(null).commit();
}

============================================================================ Fragment에서 저런식으로 버튼을 눌러 다른 Fragment로 전환하고자 Button을 클릭하면

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

이런 오류가 나오네요... 어디에서 잘못된 걸까요 ㅠㅠ?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • View 는 화면에 add 되면 내부적으로 ViewParent 를 갖게 됩니다. 해당 Exception 은 보통 이미 한번 add 했던 view 객체를 또 다시 add 하려 할때 발생하곤 합니다. 그래서 동적 view 를 추가 할때 항상 새로운 View 객체를 생성해서 add 시키곤 합니다. fragment transaction 중에 발생하는 경우는 거의 처음 보는것 같네요 ㅜㅜ replace 중에 100% 발생 한다면 replace 하려는 fragment 코드를 올려주시고, 특정 동작경로에서만 발생한다면 재현경로를 알려주시면 좋을 것 같습니다. 알 수 없는 사용자 2018.7.17 19:59
  • 메인액티비티에서 viewpager를 구현하는 프레그먼트를 불러오고 viewpager를 불러와 버튼을 클릭하면 위의 detail프레그먼트로 넘어가게됩니다. 저두 viewparent에서 문제인것 같아서 찾고 있는데 방법을 잘 모르겠습니다. 알 수 없는 사용자 2018.7.17 22:39
  • 해결하셨나요? 알 수 없는 사용자 2018.7.19 11:23
  • 네 해결했습니다. commentWriteViewReplace메소드를 실행하는 시점에서 부모fragment를 attach, detach했더니 작동했습니다. 알 수 없는 사용자 2018.7.19 13:31
  • 다행이네요 ㅋㅋ 알 수 없는 사용자 2018.7.19 13:44

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)