Android TextView在setText之后没有更新

时间:2016-09-14 11:51:27

标签: android

我有一个使用多个标签的应用。在一个选项卡上,我有一个TextView,在一个案例中,显示的值不会在.setText之后更新。当我使用带有.getText的Log.d时,它在日志中显示正确的值,但显示的TextView的内容仍为空白。

我的目标是在选项卡上有一个按钮,允许用户从原生Android调用历史记录日志中选择(我们在Phone App调用日志中看到的相同数据),然后在其中一个选项卡上更新TextView与所选呼叫日志项关联的电话号码。我正在使用StartActivityForResult来获取电话号码,而且该部分似乎是基于我在Log.d中看到的那样工作。

我已经阅读了很多关于StackOverflow的帖子以及Google搜索此问题所产生的一些博客,但似乎仍无法使其发挥作用。他们建议在TextView上使用runnable构造和.PostInvalidate方法。这些方法都没有帮助。 TextView仍然拒绝更新此特定方案。

奇怪的是,我在同一个标​​签上有其他按钮,使用.setText作为同一个TextView,它们工作得很好。但是,在没有执行StartActivityForResult的情况下,每个都在主类方法中完成所有工作。我的所有Log.d点都会生成预期结果,并显示我在下面列出的每个步骤中所期望的值。

以下是我的代码的最新迭代:

在我的类构造函数.OnCreate():

    t1 = (TextView) this.findViewById(R.id.textView1);
    Log.d("MyApp","First t1.toString: "+t1.toString());

在我的onClick()中:

    CharSequence currentNumber = t1.getText();
    switch (v.getId()) {
    case R.id.button1:
        t1.setText(currentNumber + "1");            
        break;
    case R.id.button2:
        t1.setText(currentNumber + "2");
        break;
    case R.id.button3:
        t1.setText(currentNumber + "3");
        break;
    case R.id.CallLog:
        Log.i("MyApp", "Call Log Selected");
        Intent CallLogIntent = new Intent();
        CallLogIntent.setClass(Page2Activity.this, CallLogActivity.class);
        startActivityForResult(CallLogIntent,3);
        break;

在我的OnActivityResult()中:

    case 3:
        Log.d("MyApp", "Result Received");
        Log.d("MyApp", "Result: " + data.getStringExtra("NUMBER"));
        t1 = (TextView) findViewById(R.id.textView1);
        Log.d("MyApp", "t1.toString: " + t1.toString());
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                t1.setText(data.getStringExtra("NUMBER"));
                Log.d("MyApp", "t1.getText before PostInvalidate: " + t1.getText());
                t1.postInvalidate();
                Log.d("MyApp", "t1.getText after PostInvalidate: " + t1.getText());
            }
        });
        break;

以下是添加的日志

09-14 16:13:25.022 21154-21154/com.example.startactivityforresult D/MyApp: lv: android.widget.ListView{23598aa VFED.VC.. ......I. 0,0-0,0 #102000a android:id/list}

09-14 16:13:32.462 21154-21154/com.example.startactivityforresult D/MyApp: Position: 5 adapter: android.content.ContentResolver$CursorWrapperInner@c2012bd

09-14 16:13:32.462 21154-21154/com.example.startactivityforresult D/MyApp: tv2: (555) 555-1212

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: Result Code: -1

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: Request Code: 3

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: Result Received

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: Result: (555) 555-1212

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: t1.toString: android.widget.TextView{d87d033 V.ED..... ......ID 16,16-1344,213 #7f0d0058 app:id/textView1}

09-14 16:13:32.492 21154-21154/com.example.startactivityforresult D/MyApp: t1.getText: (555) 555-1212

09-14 16:13:32.542 21154-21154/com.example.startactivityforresult D/MyApp: First t1.toString: android.widget.TextView{9504d57 V.ED..... ......I. 0,0-0,0 #7f0d0058 app:id/textView1}

2 个答案:

答案 0 :(得分:0)

<强>替换

case 3:

    Log.d("MyApp", "Result Received");
    Log.d("MyApp", "Result: " + data.getStringExtra("NUMBER"));
    Log.d("MyApp", "t1.toString: " + t1.toString());

    t1.setText(data.getStringExtra("NUMBER"));
    Log.d("MyApp", "t1.getText before PostInvalidate: " + t1.getText());

    break;

答案 1 :(得分:0)

感谢所有评论的人!事实证明,每当onActivityResult完成时就会调用onCreate,就像007所怀疑的那样。我使用SharedPreference设置作为信号量,使用布尔值和另一个String类型的SharedPreference设置,将值存储在OnActivityResult的末尾,然后在OnCreate过程中检查它。基本流程如下:

的OnCreate()

如果信号量为真:     检索SharedPreference String值并将putText放入TextView。     将信号量设置为false。   在OnCreate中完成我想要做的所有其他事情。

OnActivityResult()

从帮助程序类中获取值。   将值存储在SharedPreference字符串中。   将信号量设置为true。