1.
dialEtBox.addTextChangedListener(new PhoneNumberWatcher());
2.
class PhoneNumberWatcher implements TextWatcher { // 为什么会执行两次 public void beforeTextChanged(CharSequence s, int start, int count, int after) { System.out.println("beforeTextChanged--" + dialEtBox.getText().toString()); } public void onTextChanged(CharSequence s, int start, int before, int count) { System.out.println("onTextChanged--" + dialEtBox.getText().toString()); } public void afterTextChanged(Editable s) { System.out.println("afterTextChanged--" + dialEtBox.getText().toString()); } }
问题不是出自上面,而是,文本框中的文字改变的时候
public void updateEditText(String inputNumber) { String newNumber = dialEtBox.getText().append(inputNumber).toString();//问题所在! dialEtBox.setText(newNumber); }
改变EditText调用的是上面的方法
当执行
dialEtBox.getText().append(inputNumber)
实际上这里就已经执行了一次TextWatcher!!!
dialEtBox.setText(newNumber);
又执行了一次
需要注意的是:
dialEtBox.getText();返回的不是String,而是一个Editable对象
要将这个对象toString()之后再append内容!
改为这样就好了:
String newNumber =new StringBuilder(dialEtBox.getText().toString()).append(inputNumber).toString();
注意:先将EditText中的内容转为字符串dialEtBox.getText().toString() ,而不是仅仅dialEtBox.getText(); ,这样返回的是一个Editable对象,对这个对象的append会内TextWatcher接收到!
在使用surfaceView和MediaPlayer播放视频的时候出现了一个异常,纠结了很久,经过同事帮助,终于发现了问题的根源。
异常如下:
E/AndroidRuntime( 1765): Caused by: java.lang.IllegalArgumentException: The surface has been released
E/AndroidRuntime( 1765): at android.media.MediaPlayer._setVideoSurface(Native Method)
E/AndroidRuntime( 1765): at android.media.MediaPlayer.setDisplay(MediaPlayer.java:633)
原因是在surfaceHolder还没准备好的时候,我就调用了MediaPlayer的start()方法。
正确的播放流程应该是:
surfaceView = (SurfaceView) findViewById(R.id.PlaySurfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
mediaPlayer.setDisplay(surfaceHolder);
try {
mediaPlayer.setDataSource(this, Uri.parse("/sdcard/bianxing.ts"));
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
这样就可以正常播放了,唉,不容易啊,感谢同事的帮助。
其实对Medialayer的封装来说,VideoView已经做的很好了,自己再写这些确实费力,期望以后扩展会好点
这里 surfaceHolder 跟mediaPlayer 没有关联吗?
mediaPlayer.setDisplay() 写在哪个地方呢
这里 surfaceHolder 跟mediaPlayer 没有关联吗?
mediaPlayer.setDisplay() 写在哪个地方呢
不好意思,少了点东西,应该是在addCallBack后设置:
mediaPlayer.setDisplay(surfaceHolder);
就是这个public void setDisplay(SurfaceHolder sh)
最最近在做android图像处理工具,用主要用Canvas来进行各种操作,当保存到手机存储卡中后,仔细分析图片的存储大小,发现图片的存储大小只和图片的面积成线性关系(前提是处理同一图片)
即:
设要保存的一种大小的图片的面积为S1,存储大小为storage1,要保存的另一种一种大小的图片的面积为S2,存储大小为storage1,则有:
S1 storage1
————— = —————
S2 storage2
当然了面积大的效果好,这点毋庸置疑,生成的图片如下
上传的图片如下
面积大的为hello1(500*500),面积小的为hello2(250*250)