尝试从另一个线程访问Fragment以更改TextView文本

时间:2014-02-08 08:58:39

标签: android multithreading textview fragment handler

我正在创建一个使用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。

我做错了什么?

2 个答案:

答案 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"));
            }
        }

    }

}
祝你好运。