首页 > 解决方案 > Android:处理程序中的 SetText 不会更改 TextView 中的文本

问题描述

我有一个连接到蓝牙并显示收到的信息的应用程序。当按下时,活动不会被杀死,我可以回到活动,一切都是一样的。该活动在后台收集数据,一切都很好我有一个按钮,按下时会杀死所有活动(包括显示数据的活动)。当我尝试再次创建该活动时,数据不断涌现,我仍然可以处理它并将其写入文件,但它不会在 UI 中显示。在第二次创建活动后,处理程序中的 setText 函数似乎不起作用(setText 确实在处理程序之外工作)。

synced如果第二次创建活动,则布尔值为真。这是OnCreate

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin);
        loading_panel = findViewById(R.id.loadingPanel);
        loading_panel.setVisibility(View.GONE);
        connectionButton = (Button) findViewById(R.id.connection_button);

        gsrTextView = (TextView) findViewById(R.id.gsr_textview);
        emgTextView = (TextView) findViewById(R.id.emg_textview);
        adxlTextView = (TextView) findViewById(R.id.adxl_textview);
        fsrTextView = (TextView) findViewById(R.id.fsr_textview);
        textviews_set=true;
        if(synced)
        {
            setConnected(currMac);
            manageConnection();
            Button sync_button = (Button) findViewById(R.id.sync_button);
            sync_button.setText(R.string.synced_text);
        }
        // more code
    }

实施OnBackPressed

@Override
    public void onBackPressed() {
        Intent i = new Intent(AdminActivity.this, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(i);
    }

这是处理程序的(部分):

@SuppressLint("HandlerLeak")
    public final Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                //a lot of code for other cases
                case READ_SUCCESS:
                    String s = (String) msg.obj;
                    showData(s);
                    
                    break;
            }
        }
    }

这是(部分)showData:private void showData(String s) { // todo: 1.parse the json; 2.在 textViews 上显示数据(json 组件)

    try {
        //Log.d(LOG_TAG, "the new string is " + s);
        JSONObject json = new JSONObject(s);

        // Collect the sensors measurements
        String gsrMeasure = json.getString("gsr");
        String emgMeasure = json.getString("emg");
        String adxlMeasure = json.getString("adxl");
        String fsrMeasure = json.getString("fsr");
        String time_str = json.getString("time");

        // Show the data
        if(textviews_set) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.d(LOG_TAG, "ABOUT TO SET TEXT");
                    gsrTextView.setText(gsrMeasure);
                    emgTextView.setText(emgMeasure);
                    adxlTextView.setText(adxlMeasure);
                    fsrTextView.setText(fsrMeasure);
                }
            });
        }
        //more code
    }
}

我什至确保runOnUiThread 我在 UI 线程上运行 setText,即使它在findViewByID没有textviews_set它不会发生

值得一提的是,当我第一次创建活动时,蓝牙设备没有连接,因此处理程序没有运行,所以问题很可能就在那里。我只是不知道到底在哪里,或者如何解决它。

标签: javaandroiduser-interfacetextviewsettext

解决方案


如果有人遇到同样的问题,我发现了问题所在。我将所有文本视图声明为非静态的,因此在第二次创建活动时,由于某种原因,处理程序仍然引用了活动第一个实例的文本视图。我所要做的就是将类中的文本视图声明为static,因此当我第二次创建活动时,文本视图已经被声明并引用了 xml 中的实际文本视图。


推荐阅读