前段时间项目需求,需要做一个有限制长度的输入框并动态显示剩余文字,同时也要动态改变EditText的高度来增加用户体验。现整理出来与大家分享。

先来看看效果图


看了效果就分享一下布局

                            

android:layout_alignParentBottom="true"
这句很重要,很多人在第一次做的时候不知道,经常会说弹出的键盘会遮住了输入框,这个加上manifest.xml里的android:configChanges="keyboardHidden|orientation|screenSize"就能可以实现弹出输入法时吧输入框顶上去

                                                           

这里我使用TextWatcher来对EditText进行监听,动态计算输入的内容。至于取得控件的高度,相信不少新人都是在oncreate方法里使用getHeight方法来取得高度,然后很多人都会抛去一个问题,怎么我取得的值为0?这是因为activity在初始化的时候创建view,而在刚创建view对象时系统并没有绘制完成,因此get出来的高度为0。那么怎么去正确get到高度?应该是在view绘制完成后再去get,是的,监听view的绘制,在view绘制完成后再使用getHeight方法。这里我建议使用ViewTreeObserver方法来监听,再view绘制完成后系统会回调给acitvity通知其绘制完成,而且只执行一次。具体代码如下

package com.hjhrq1991.myeditdemo;import android.os.Bundle;import android.app.Activity;import android.text.Editable;import android.text.TextWatcher;import android.view.View;import android.view.ViewTreeObserver;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.widget.EditText;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private EditText mMsg;//输入框private TextView mContentLen;//文字长度提示文本private int mHeight;private int middleHeight;private int maxHeight;private boolean lenTips = true;private int MAX_LENGTH = 100;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}/** * @deprecated 初始化,在这里使用ViewTreeObserver获取控件的高度 */private void init() {mMsg = (EditText) findViewById(R.id.input);mContentLen = (TextView) findViewById(R.id.contentlen);//动态计算字符串的长度mMsg.addTextChangedListener(mTextWatcher);//取得控件高度ViewTreeObserver vto2 = mMsg.getViewTreeObserver();vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {mMsg.getViewTreeObserver().removeGlobalOnLayoutListener(this);mHeight = mMsg.getHeight();middleHeight = 8 * mHeight / 5;maxHeight = 21 * mHeight / 10;}});}/** * edittext输入监听 */TextWatcher mTextWatcher = new TextWatcher() {private CharSequence temp;// private int editStart;// private int editEnd;@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {// TODO Auto-generated method stubtemp = s.toString().trim();}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODO Auto-generated method stub// editStart = mMsg.getSelectionStart();// editEnd = mMsg.getSelectionEnd();int len = temp.length();//取得内容长度int lineCount = mMsg.getLineCount();//取得内容的行数if (len != 0) {mContentLen.setVisibility(View.VISIBLE);if (len <= MAX_LENGTH) {mContentLen.setText("(" + (MAX_LENGTH - temp.length())+ ")");} else {if (lenTips) {Toast.makeText(getApplicationContext(),String.format(getString(R.string.more_than_litmit),MAX_LENGTH), 100).show();lenTips = false;}mContentLen.setText("(-" + (temp.length() - MAX_LENGTH)+ ")");}} else {mContentLen.setVisibility(View.GONE);}/** * 根据行数动态计算输入框的高度 */RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mMsg.getLayoutParams();if (lineCount <= 1) {params.height = mHeight;mMsg.setLayoutParams(params);} else if (lineCount == 2) {params.height = middleHeight;mMsg.setLayoutParams(params);} else {params.height = maxHeight;mMsg.setLayoutParams(params);}}};}
大致思路就是如此。如有疑问,欢迎加关注联系,相互学习。

demo下载请猛戳

如有转载,请注明出处:http://blog.csdn.net/hjhrq1991

更多相关文章

  1. Android(安卓)matrix 控制图片的旋转、缩放、移动
  2. Android中dispatchDraw分析
  3. 锁屏界面
  4. Android软键盘适配问题
  5. Android(安卓)EditText 设置行距不影响光标高度
  6. Android实现下载文件功能的方法
  7. android OpenGL ES2.0编程初学
  8. Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
  9. android和j2me之清屏(clearScreen)

随机推荐

  1. Android系统架构解析
  2. 谈谈Android的so
  3. Android开发实例详解之IMF(Android(安卓)S
  4. Android(安卓)studio快捷键大全+Android(
  5. [Android] Android开发规范
  6. Android(安卓)内存管理机制
  7. android 工程师级别划分及学习路线
  8. Android(安卓)Bluetooth蓝牙开发\蓝牙协
  9. Android录音并根据音量大小实现简单动画
  10. [置顶] 电源管理之android内核suspend to