1

在我的 Activity 中,我有一种方法可以根据 TextView 的宽度使字体大小变大或变小。我在 TextView 上执行 setText 以输入一个新值(这很可能会增加或减少 ViewText 的宽度),然后直接进入我的方法。我的问题是,当我输入我的方法时,TextView 的大小还没有改变,所以我猜测 UI 线程需要更多时间来完成 TextView 的调整大小,因此我的方法不起作用. 那么如何在 UI 线程之后等待,以便我可以正确执行我的方法的代码呢?

这是我的主要活动的代码。方法 texteAffichage 只是设置我的 TextView 中的内容,而 gestionPolice 正在调整字体大小(如果需要)。当我在 gestionPolice 中执行 sysout 时,我从来没有得到 TextView 的当前宽度,因为它似乎没有时间这样做。

affichage.setText(texteAffichage((Button) v));
gestionPolice();
4

2 回答 2

2

您可以使用Handler延迟您的代码:

 Handler h = new Handler();

 h.postDelayed(new Runnable() {

     @Override
     public void run() {
         // DO DELAYED STUFF
     }
 }, your_variable_amount_of_time); // e.g. 3000 milliseconds

旁注:我认为您的问题不会发生,因为 setText(...) 方法需要太多时间。发布您的代码,以便其他人可以查看它。

于 2013-09-11T22:03:03.310 回答
1

我的建议是这样的:

        tv.setText("someText");
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                int width = tv.getWidth();
                // your code reacting to the change in width
            }
        }, 50);

50 毫秒应该足以完成 UI 的更改,但也足够快让用户不会注意到。

正如西蒙正确指出的那样,这不一定是最好的解决方案。举个例子说明如何使用GlobalLayoutListener

    final ViewTreeObserver vto = tv.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            width = tv.getWidth();
            // your code reacting to the change in width

        }
    });
于 2013-09-11T22:08:29.457 回答