我有一个使用多个标签的应用。在一个选项卡上,我有一个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}
答案 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。