Fragments를 사용하는 앱을 만들고 랩톱과 통신하는 클라이언트 스레드에서받은 메시지를 기반으로 TextView의 텍스트를 변경하려고합니다. 클라이언트 서버 통신은 문제가되지 않습니다. 클라이언트 스레드가 문자열을 정상적으로 수신하고 있기 때문입니다.다른 스레드에서 Fragment에 액세스하여 TextView 텍스트를 변경하려고합니다
파편 TextView에 액세스하고 텍스트를 변경하는 방법을 제대로 파악하지 못하는 것 같습니다. 여기 내가 현재 그렇게하려고하는 방법입니다 :이 경우
class ClientThread implements Runnable {
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
LivingRoomFragment frag = (LivingRoomFragment)getSupportFragmentManager().findFragmentById(R.id.LivingRoomFragment);
frag.setText("Inside ClientThread right now");
}
});
}
}
public static class LivingRoomFragment extends Fragment {
public static final String ARG_SECTION_NUMBER = "section_number";
TextView temp;
public LivingRoomFragment(){
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_room_control_fragment1, container, false);
temp = (TextView) rootView.findViewById(R.id.textView5);
MainActivity main = new MainActivity();
new Thread(main.new ClientThread(requests)).start();
return rootView;
}
public void setText(String s){
temp.setText(s);
}
}
, MainActivity는 FragmentActivity을 확장 활동이다.
나는 에뮬레이터를 사용하고 있는데 응용 프로그램은 항상 frag.setText("Inside ClientThread right now")
을 사용하는 줄에 null 포인터 예외가 있다고 말하면서 충돌합니다. 이는 LivingRoomFragment의 인스턴스가 null이라는 것을 의미합니다. 지금까지와 같은 방법을 사용하지 않고 스레드에서 UI에 액세스 할 수 없으므로 Handler를 사용하여이 메서드를 실행해야합니다.
내가 뭘 잘못하고 있니? 나는 확실하지 않다
현재 단편과 통신하는 대신 단편의 새 인스턴스를 생성합니다. –
좋아, 현재 조각과 어떻게 의사 소통을하니? 나는'getFragmentById()'가 현재 프래그먼트를 얻고 있다고 생각했지만, 실제로 그 프래그먼트 ID를 사용하여 새로운 인스턴스를 만드는 것이 무엇인지 생각해 본다. – Toast
정확합니다. ID를 사용하는 것은 처음에 LivingRoomFragment를 Fragment manager로 커밋 할 때 태그를 설정하여 null 인 새 인스턴스를 만들고있었습니다. 나중에'.getFragmentByTag (tag) '를 사용하여 해당 조각에 액세스 할 수 있습니다. – Toast