【问题标题】:TextView paints text garbled on update and scrollTextView 在更新和滚动时绘制乱码的文本
【发布时间】:2013-07-23 16:04:35
【问题描述】:

我创建了一个测试 android 应用程序,它监听 RabbitMQ 服务器上的主题并在文本视图中显示消息。

除了在添加到“输出”文本视图的每条新消息上都将新文本绘制在旧文本上之外,一切正常。当我滚动时也会发生同样的情况,如第二张图片所示。当应用程序进入后台并再次激活时,文本再次正常显示(见图1)。

我的布局真的很简单:我做错了什么?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="60dp" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Connection status" />

<TextView
    android:id="@+id/status"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:saveEnabled="false"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Received messages:" />

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView
        android:id="@+id/output"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:saveEnabled="false"
        android:textAppearance="?android:attr/textAppearanceSmall" />
</ScrollView>

这里是我处理传入的新消息的地方:

final Handler myViewUpdateHandler = new Handler() {
    // @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case NEWSTATUS: 
            status.setText((String) msg.obj);
            status.invalidate();
            //also add to output
        case NEWMESSAGE:
            String oldText= (String) output.getText();
            output.setText("");

            String newText = DateUtil.getClockTimeMillis()+" "+(String) msg.obj+"\n"+oldText;

            output.setText(newText);
            output.invalidate();
            break;
        default:
            throw new IllegalArgumentException("no case for:" + msg.arg1);
        }
        super.handleMessage(msg);
    }
};

【问题讨论】:

    标签: android


    【解决方案1】:

    我也遇到过同样的问题。就我而言,这就是发生的事情以及我是如何解决的:

    • 首先我添加了具有全屏属性的第二个活动(通过 日食向导)

    • 然后我决定不使用那个花哨的全屏动画,所以我
      编辑布局 XML 文件并将其更改为正常的相对视图。

    • 应用清单文件表明此活动仍在使用 全屏主题。

    • 我已经删除了这些行,并且...问题解决了。

    如果您为布局设置了全屏主题,请尝试将其更改为应用主主题。

    【讨论】:

    • 我完全按照你的描述做了,首先生成一个全屏活动,然后更改为正常并且确实样式仍然是全屏。不幸的是,由于项目关闭,我无法再测试代码(我们不再需要该测试代码)。我仍然认为您的分析和解决方案是正确的。
    【解决方案2】:

    尝试从所有情况下删除 invalidate() 方法调用,如果它不能解决问题,请在您的 xml 中将其放入 TextView 的 ScrollView 属性(id=output)中

     android:cacheColorHint="#00000000"
    

    【讨论】:

    • 感谢您的建议。我尝试了单独和一起:唉,它不能解决我的问题。我对这个问题感到困惑,在我的其他应用程序中,我从来没有遇到过这样的事情。这应该很简单吧?
    • 是的,通常你不应该有这个问题。可能导致这种情况的另一个问题是,可能您的处理程序刷新太多,以至于您的设备无法达到处理程序的频率,请尝试通过以下代码降低处理程序的频率。处理程序处理程序=新处理程序(); handler.postDelayed(new Runnable() { public void run() { // 把你的更新代码放在这里 }}, 5000(-或另一个数字-); 这意味着你的处理程序将每 5000 毫秒刷新一次,你可以修改它,如果似乎太快/太慢了。
    • 这对我不起作用,因为我使用 textview 的内容作为我的缓存(也许这是我的问题)? -> String newText = DateUtil.getClockTimeMillis()+" "+(String) msg​​.obj+"\n"+oldText;
    • hımm 也许吧。另一种方法是增加为您的应用程序分配的缓存大小。
    • 好的尝试了一个单独的字符串字段来缓存文本,没有帮助:(我不认为处理程序是问题,因为它发生在滚动到:我声明我的 TextView 的方式一定有问题
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多