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

텍스트뷰 관련 질문입니다 5일째 해답을 못찾고있어요 살려주세요

0 추천
public class bottomSheetDialog extends BottomSheetDialogFragment {
    TextView tv_content;
    public bottomSheetDialog(){}

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

        tv_content = (TextView) v.findViewById(R.id.tv_content);
        tv_content.setText("hi");
        return v;
    }

    public void setContent(String content)
    {
        tv_content.setText(content);
    }
}

 

onCreateView에서 setText는 잘 작동됩니다

근데 다른 클래스에서 setContent호출하여 string값을 setText하려는데 오류가 나네요 디버깅시 content값은 잘 들어왔습니다 

Textview는 저렇게 전역변수로 사용을 못하나요? 해결 방법좀 알려주시면 감사하겠습니다

저좀살려주세요 (160 포인트) 님이 2021년 5월 4일 질문

1개의 답변

0 추천

당연히 사용할 수 있습니다. 아마도 문제는 setContent를 호출하신 시점이 아닌가 싶네요. 해당 메소드는 레이아웃이 inflate 되어서 화면에 놓여지고 난 뒤 tv_content에 인스턴스가 할당되고 나서 가능합니다. 안드로이드가 onCreateView에서 리턴된 View를 가지고 화면에 위치시키기 때문에 onCreate에서는 아직 tv_content에 접근할 수 있는 상태가 아닐 듯 합니다. Fragment의 경우 onCreateView에서는 Layout만 inflate하고 뷰를 바인딩하는 초기화 작업은. onViewCreated에서 처리하시면 될 것 같습니다.

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_popup, container, false)
}

@Override
public void onViewCreated(View view, @Nullable Bundle: savedInstanceState) {
        super.onViewCreated(view, savedInstanceState)
        setupViews(view);
}

private void setupViews(View view) {
        tv_content = (TextView) view.findViewById(R.id.tv_content);
        setContent("hi");
}
 
public void setContent(String content) {
        tv_content.setText(content);
}

 

spark (227,470 포인트) 님이 2021년 5월 4일 답변
spark님이 2021년 5월 5일 수정
setupViwes()에서 v변수는 어디서 초기화 하면 되나요?!?
onViewCreateView에서  setupView로 view를 전달하는 부분을 빼먹었네요. 다른 접근 방법이지만 Fragment의 rootView를 requireView()를 통해 접근하실 수도 있습니다.
지속적인 답변 감사합니다..!!! 계속 시도중인데 다른 클래스에서
protected void onPostExecute(String result) {
            super.onPostExecute(result);            
            try
            {
                bottomSheetDialog bt = new bottomSheetDialog();
                bt.setContent(result);
            }
            catch (Exception e)
            {
                System.out.println(e);
            }
호출하려 하는데
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
에러가 나오네요 초반이랑 비슷한 오류인거 같습니다 왜이럴까요ㅜㅜ
위의 코드만 가지고는 어떻게 다른 클래스에서 해당 Fragment에 접근하는지 정확하게 알 수가 없네요. 질문에 올리신 코드가 BottomSheetDialog이고 AsyncTask에서  접근하려고 하시는 건가요? 이게 맞다면 제가 역으로 세가지 질문을 드릴게요?
1.왜 AsyncTask 하는 작업을 BottomSheetDiloag에서 하지않고 외부에서 호출한 다음 BottomSheetDialog를 생성한 다음 텍스트를 세팅하려고 하나요?
2. bt.setContent(result)를 호출하실 때 어떻게 bt라는 객체가 널이 아닌 걸 확신하실 수 있나요? (BottomSheetDialog의 레이아웃이 제자리를 잡기 전일 수 있는데요.)
3. BottomSheetDialog가 Fragment인가요 Dialog인가요?
...