重点易混淆知识点:
1:getX是基于父控件的X位置
2: getRawX是从屏幕最左边开始的X
3:获取在当前窗口内的绝对坐标,getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父窗口里的坐标。
4: right =left+width
5: bottom=top+height
6: getLocationOnScreen():在整个屏幕中的位置 getlocationOnWindow():相对于父控件的位置
7:getMeasureWidth和View.getWidth :
①getMeasuredWidth方法获得的值是setMeasuredDimension方法设置的值,它的值在measure方法运行后就会确定
②getWidth方法获得是layout方法中传递的四个参数中的mRight-mLeft,它的值是在layout方法运行后确定的
③一般情况下在onLayout方法中使用getMeasuredWidth方法,而在除onLayout方法之外的地方用getWidth方法。
不太常用但是很重要的知识点:
1:
/** * 自动初始化所有控件 */ private void autoInitAllWidgets() { // 得到该Activity的所有字段 Field[] fields = this.getClass().getDeclaredFields(); for (Field field : fields) { // 反射访问私有成员,必须加上这句 field.setAccessible(true); try { int id = R.id.class.getField(field.getName()).getInt(new R.id()); // 然后对这个属性赋值 field.set(this, this.findViewById(id)); } catch (Exception e) { } } }
2: 获取手机里的图片
/* * 从相册获取 */ public void gallery() { // 激活系统图库,选择一张图片 // Intent intent = new Intent(Intent.ACTION_PICK); // intent.setType("image/*"); // startActivityForResult(intent, PHOTO_REQUEST_GALLERY); Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PHOTO_REQUEST_GALLERY); } /* * 从相机获取 */ public void camera() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); // 判断存储卡是否可以用,可用进行存储 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME))); } startActivityForResult(intent, PHOTO_REQUEST_CAMERA); }
3:软键盘搜索和其他功能
在xml文件中,对EditText的设置如下:加上属性:android:imeOptions=""
actionSearch: 搜索
actionSend: 发送
actionNext: 下一项
同样,也可在activity代码中设置imeOptions:
editText.setImeOptions(EditorInfo.IME_ACTION_SEND);
Activity中监听事件 :
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId==EditorInfo.IME_ACTION_SEND ||(event!=null&&event.getKeyCode()== KeyEvent.KEYCODE_ENTER))
{
//do something;
return true;
}
return false;
}
});
4:EditText进制输入表情
mEditTextView.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable editable) {int index = mTvContent.getSelectionStart() - 1; String s1 = s.toString(); if(s1.length()>0){ if (EmojiUtils.containsEmoji(s1)) { AMToast.show(PostActivity.this, "不能输入表情", Toast.LENGTH_SHORT); Editable text = mTvContent.getText(); text.delete(index, index + 1); } }@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {});
5:EditText清除不了焦点问题、
通过查看源码,控件焦点是一级一级遍历的,解决以上问题,只要在EdiitText父控件中加上:
android:focusableInTouchMode="true"
就可以解决了!
6:关于文件目录
绝对目录:即App在data/data/app包名所在的目录 :
context.getApplicationContext().getFilesDir() .getAbsolutePath() + IN_PATH SD卡目录:"/sdcard/" + packageName + "/cache/" 也可以Environment.getExternalStorageDirectory() 7:直接调转到APP外第三方地图Uri mUri = Uri.parse("geo:39.940409,116.355257?q=西直门"); Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri); startActivity(mIntent);