Monitor项目开发走过的路~实现一个类似命令行形式的TextView

来源:互联网 发布:sql 不等于空字符串 编辑:程序博客网 时间:2024/06/01 22:29

  在Monitor项目开发过程中我们想实现一个类似于电脑上Dos命令行形式的窗口,功能是实现向服务器提交命令,然后将服务器返回的结果以字符形式显示在一个窗口中,可以不断地追加。最开始我思考之后的想法是利用一个RecyclerView来实现,就像QQ发送与接收消息那样子。但是很快这个方案就被团队的成员否定了,因为不太符合APP的整体风格,于是就只能按照最初的想法来用做一个只显示文本的界面,那毫无疑问就选择用TextView了,它有一个append()方法可以随时追加字符串。

try {       InputStream responseIn = mControlOtherMode.resultTranIn;       final byte[] buffer = new byte[1024];       while (true) {             int length = responseIn.read(buffer);             System.out.println(length);             final String resonse = new String(buffer, 0, length, "GBK");             runOnUiThread(new Runnable() {                  @Override                  public void run() {                        mTextView.append(resonse);                  }             });             if (length == -1)                 break;        }       System.out.print("网络断开333");} catch (UnsupportedEncodingException e) {     e.printStackTrace();} catch (IOException e) {     e.printStackTrace();}

  如上代码在while循环中不断地从输入流读取数据然后用mTextView.append(resonse)来添加到TextView中,你可以在数据上做一些处理,例如每次返回的数据后都加一个换行。为了效果更加的接近命令行,你可能会想到TextView的内容多到占满整个屏幕时怎么办,其实只要加入下面的代码即可让你的TextView可以滑动起来,扩展它的显示范围。

mTextView = (TextView) findViewById(R.id.msg_textView);mTextView.setMovementMethod(ScrollingMovementMethod.getInstance());

  当然还可以将你的命令行进一步优化,设想在你调用软键盘输入命令后如果命令行能自动滑动到刚刚返回的消息位置时那不是很好,那么只要在你调用append()之后计算要移动的目标位置接着调用mTextView.scrollTo()方法即可。

runOnUiThread(new Runnable() {                  @Override                  public void run() {                        mTextView.append(resonse);                        //自动移动到文字的最低端                        offset = mTextView.getLineCount() * mTextView.getLineHeight();                        if (offset > mTextView.getHeight()) {                               mTextView.scrollTo(0, offset - mTextView.getHeight() + mTextView.getLineHeight());                        }                  }});

  下面是最后的实现效果,看起来也是相当不错的。

这里写图片描述

这里写图片描述

这里写图片描述

阅读全文
0 0
原创粉丝点击