【问题标题】:view.setText happening after loop?view.setText 在循环后发生?
【发布时间】:2013-12-08 01:06:23
【问题描述】:

我是安卓编程新手。我在单击按钮时发生以下代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button = (Button) findViewById(R.id.morse_btn);

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            loopCode();
        }
    });
}

这叫这个:

    public void loopCode()
{
        String code = "Hello There";
        TextView view = (TextView) findViewById(R.id.code_txt);
        String s = "";
        for(int i = 0; i < code.length(); i++)
        {
           s+=code.charAt(i);
           view.setText(s);
           try {
               TimeUnit.SECONDS.sleep(1);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }

但是当我在手机上运行它时,直到 for 循环完成后,文本才会被附加,即我按下按钮,几秒钟后,整个字符串“Hello There”出现。

我怎样才能让它一次写一个字符,就像打字机一样。

谢谢

【问题讨论】:

  • 你需要附加文本而不是 settext

标签: java android


【解决方案1】:

您需要使用view.append(""),它将新文本附加到现有文本。

试试这个代码:

int i = 0; //declare this globally
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if(i != 10) { 
                text.append(" " + i);
                i++;
                handler.postDelayed(this, 1000);
            }
        }
    }, 1000);
}

此代码将每隔一秒将一个新数字附加到TextView,直到达到计数 10。您可以应用相同的逻辑。

我已将这个solution 提供给here 的问题 -

[编辑]

试试这个:

String code = "Hello There"; //declare variable globally
int i = 0; //declare globally
TextView view; //declare globally

public void loopCode()
    {
                view = (TextView) findViewById(R.id.code_txt);
                //String s = "";
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if(i != code.length()) { 
                                view.append(" " + code.charAt(i));
                                i++;
                                handler.postDelayed(this, 1000);
                            }
                        }
                    }, 1000);
                }
     }

不要忘记全局声明int i = 0String code = "Hello There"

【讨论】:

  • 描述资源路径位置类型不能引用在不同方法 MainActivity.java 中定义的内部类中的非最终变量 i
【解决方案2】:

TextView 中存在 2 种不同的方法 setText。

  • public final void setText (int resid)
  • public final void setText(CharSequence 文本)

当您将变量 int 放入 setText 时,android 会尝试在同一代码中的 classe R 变量中查找字符串。 为了解决这个问题,您可以使用 String.valueOF(...)

将 int 转换为字符串

查看更多; http://developer.android.com/reference/android/widget/TextView.html#setText(java.lang.CharSequence)

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#valueOf(int)

试试

       public void loopCode()
{
        String code = "Hello There";
        TextView view = (TextView) findViewById(R.id.code_txt);
        String s = "";
        for(int i = 0; i < code.length(); i++)
        {

           view.setText(String.valueOf(i));
           try {
               TimeUnit.SECONDS.sleep(1);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多