我正在创建一个使用Fragments的应用程序,并希望根据与笔记本电脑通信的客户端线程中收到的消息更改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")
的行处有一个空指针异常,我相信这意味着LivingRoomFragment的实例为空。到目前为止,据我所知,这应该是使用Handler执行的,因为如果不使用这样的方法就无法从线程访问UI。
我做错了什么?
答案 0 :(得分:0)
我不确定,请尝试
MainActivity main = (MainActivity)getActivity;
而不是
MainActivity main = new MainActivity();
答案 1 :(得分:0)
在片段中创建广播接收器。 创建你的动作,动作是使你的广播分散的关键。
使用下面的示例代码。(你没有发布更多的代码,所以它可能不是你想要的好吗?)
class ClientThread implements Runnable {
private Handler mHandler;
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent("my_action");
intent.putExtra("message", "TEXT_YOU_WANT_TO_SET");
sendBroadcast(intent);
// LocalBroadcastManager manager = LocalBroadcastManager
// .getInstance(context);
// 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;
private MyBroadCastReceiver broadCastReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
broadCastReceiver = new MyBroadCastReceiver();
getActivity().registerReceiver(broadCastReceiver,
new IntentFilter("my_action"));
}
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);
}
private class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent intent) {
// chaneg the TextView text here
if (intent.getAction() != null
&& intent.getAction().equalsIgnoreCase("my_action")) {
temp.setText(intent.getStringExtra("message"));
}
}
}
}
祝你好运。