主要解决API4.0以上版本google输入法bug,需要给AVD安装搜狗输入法。
打开需要安装的AVD, 将搜狗输入法apk放入SDK/tools文件夹中, 命令cmd---> XXX..../SDK/tools adb install sougoushurufa.apk
(2) AutoCompleteTextView提示字符
该控件默认输入两个字符以上才会出现提示,在xml中定义该控件中添加 android:completionThreshold="1" 即可定义输入一个字符就显示提示
(3) 与Android无关~~Calender类使用
Calendar calendar=Calendar.getInstance(Locale.CHINA);
int Month=calendar.get(Calendar.MONTH);
此时要注意,Calendar类拿到的Month是从0开始计算的,所以真正的月份要+1
(4) Menu
//每次点击menu键触发
@Override
public boolean onPrepareOptionsMenu(Menu menu){
showSearchWindow();
return true;
}
注意!!这个时候如果返回的是true,会导致点击menu键出现延迟的显现,要点击很多下才会有效果,所以这时候应该return false!!
(5)如何在app中引用外部下载的项目/将一个已经存在的项目作为一个Library?
导入项目后,右键properties-->Android--> is Library选线打钩
在你的app中就可以在library中添加这个项目了
(6)使用AlertDialog的小Demo
Builder alertBuilder=new AlertDialog.Builder(this);
AlertDialog alertDialog=alertBuilder.create();
final EditText inputText=(EditText)alertDialog.findViewById(R.id.search_remark_edittext);
alertBuilder.setTitle(dialogTitle).
setView(getLayoutInflater().inflate(R.layout.search_remark_dialog,null)).setPositiveButton(dialogConfirmButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String remarkString=inputText.getText().toString();
SearchRemark(remarkString);
}
}).
setNegativeButton(dialogCancelButton, null).show();
(7) 给一个relativelayout添加layout_alignParentBottom:
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
buttomLayout.setLayoutParams(params);
(8) 代码添加layout_above:
RelativeLayout.Layoutparams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);
button.setLayoutParams(params);
(9) 用代码给一个view添加一个click
XX.performClick();
(10)初始化EditText的时候阻止系统自动弹出的软键盘///打开软件盘在(14)
在manifest.xml文件里,找到相应的activity在里面的<activity>中添加下面两行代码即可
- android:windowSoftInputMode="adjustUnspecified|stateHidden"
- android:configChanges="orientation|keyboardHidden"
(11) 给EditText的输入监听
searchRemarkEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
System.out.println("!!!!!!!!!! "+s);
searchRemark(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
(12) 卸载app时系统报错:数据包为有效的设备管理器
解决方法:重启设备再次删除
(13)android:hint属性
在EditText中使用android:hint的标签,当切换语言种类的时候,hint内容并不改变。
例如,android:hint="@string/mark_hint"
初始化的语言环境是En,则切换到中文状态的时候,依然是“Hint”
因为切换功能是用一个新的activity实现的,所以切换语言完毕之后该activity处在onResume方法中,所以直接在onResume()方法里面设置edit.setHint(getResource.getString(R.string.mark_hint))即可
(14)打开软键盘/关闭软键盘在(10)
- InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
- imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
(15) 设置EditText光标位置
editText.setSelection(index);//int index
(16) 关于ListFragment的问题
按照android官方文档上的例子,尝试写了一个Shakespeare的小demo,但是竖屏的时候初始化总是出现TitlesFragment cannot cast to app.Fragment的错误
实在想不通,记录一下,其实真心不需要使用listFragment那么烦,还要设定系统版本在3.0以上才可以使用,直接使用ListView即可
(17) 使用fragment的注意事项
使用fragment时,初始化fragment的activity要继承FragmentActivity而非Activity,否则会报cannot be cast to andrpod.app.Fragment错误~
(18)官网的Fragment例子有问题
在写官网demo例子的时候要注意,当切换竖屏时,点击listfragment的item会开启一个新的activity,但是这个activity依然使用到了fragment,所以记住,只要使用了fragment的activity,都要继承FragmentActivity
并且在使用的时候要注意android.support.v4.Fragment和android.app.Fragment的区别,导包的时候注意到support.v4的包,尽量不要用app的包,因为app只支持11以上,且eclipse会各种报错,添加很多注释
并且在这个FragmentActivity中,使用的FragmentTransaction总是报错,说不能讲support.v4.FragmentTransaction转换成app.FragmentTransaction,修正方法为:
FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(android.R.id.content,details).commit();
注意调用方法并不是getFragmentManager()!!!!!
(19) ImageView代码设置
//设置背景和大小参数
imageView.setImageResource(ROLES_IMAGE[getShownIndex()]);
imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
(20)解决两个activity切换时的黑屏问题
其实是第二个activity启动时UI阻塞,而activity背景色为黑色,所以先加载黑色的背景
此时将第二个activity背景色设置为透明即可,方法有两种:
<1> 如果app中没有复杂布局,直接在manifest.xml中设置activity的theme即可
android:theme="@android:style/Theme.Translucent"
<2> 如果需要实现app的自定义style,则稍微复杂
首先在style中自定义activity的theme
<style name="Transparent" parent="android:Theme.Light">
<item name="android:windowIsTranslucent">true</item>
</style>
还有别的item自己定义,例如
<item name="actionBarStyle">@style/ActionBar</item>
<item name="android:actionBarStyle">@style/ActionBar</item>
其次在manifest中设置activity:theme为自定义的Transparent即可
(21)软键盘布局管理
在Activity中设置:android:windowSoftInputMode="stateUnspecified",
"stateUnchanged", 软键盘被保持上次的状态。
"stateHidden", 当用户选择该Activity时,软键盘被隐藏。
"stateAlwaysHidden", 软键盘总是被隐藏的。
"stateVisible",. 软键盘是可见的。
"stateAlwaysVisible", 当用户选择这个Activity时,软键盘是可见的。
"adjustResize", (压缩模式) 当软键盘弹出时,要对主窗口调整屏幕的大小以便留出软键盘的空间。
"adjustPan" (平移模式:当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时, 窗口就会进行平移。也就是说,该模式始终是保持输入框为可见。(键盘遮挡使用这种方法就能解决了!)
(22) dialog 的设置
dialog中如果不注意设置 dialog.setCanceledOnTouchOutside(false);
会出现dialog失去焦点时取消事件,如果设置了,那么只能通过dialog的按钮对dialog进行确定和取消操作
(23)在android中发送http请求一定不在主线程中发送,要使用AsyncTask等发送!
(24) 适用cmd命令打开mysql: 记住是!! mysql -uroot -p
(25)取消app的统一menu
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_show_scanner_guide);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
注意第一句是取消app的统一设置的menu,第二句是当前activity的初始化,第三句是完全全屏,连显示时间的最上面一条通知栏也去掉
(26) 颜色的透明度在xml文件中的设置
如果不想在代码中设置而是在xml文件中直接定义颜色的透明度,则颜色的值不是原来的6位而是8位,前两位就是该颜色的透明度
例如,#7D2286f2 这个颜色是透明度为125的蓝色,7D就是透明度,后面6位才是正常的RGB值
(27) 使用SharedPreferences记录某个activity是否第一次激活
1. 首先创建方法 isFirstClick()判断是否第一次点击
private boolean isFirstClick(){
SharedPreferences sp = getSharedPreferences(Constants.GET_SCANNER_KEY, Context.MODE_PRIVATE);
boolean firstclick = sp.getBoolean(Constants.GET_SHAREDPREF_SCANNER_KEY, true);
return firstclick;
}
2. 点击之后将该值设置为false
private void setClickFalse(){
SharedPreferences sp = getSharedPreferences(Constants.GET_SCANNER_KEY, Context.MODE_PRIVATE);
Editor spEditor = sp.edit();
spEditor.putBoolean(Constants.GET_SHAREDPREF_SCANNER_KEY, false);
spEditor.commit();
}
3.使用
首先使用isFirstClick判断是否为true,如果为真,则是第一次进入该activity,可进行相应的操作。
操作完毕之后,调用setClickFalse方法将其设置为false,此后每次进入该activity检查isFirstClick时,返回值都是false
(28) 不同设备的SD卡地址获取
网上找到的command的方法对于samsung的4.4.2的Note 3 完全无用
最后发现其SD card的地址如下:
/mnt/extSdCard
其余的设备的SD card用下面的方法获取应该OK
public static String getExterPath()
{
String sdcardPath = null;
String devStoragePath = null;
String tempPath = null;
boolean checkExternalStorage=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (checkExternalStorage) {
devStoragePath = Environment.getExternalStorageDirectory().toString();
}
String info = getSystemPathInfo();
if (info != null && !"".equals(info)) {
String[] infos = info.split("\n");
for (String path : infos) {
if (path.contains("*") && path.toLowerCase().contains("sdcard")) {
tempPath = path.substring(1,path.length());
if (!tempPath.equals(devStoragePath)) {
sdcardPath = tempPath;
}
}
}
}
return sdcardPath;
(29) 获取设备机型,系统型号
String model= android.os.Build.MODEL;
String version =android.os.Build.VERSION.SDK;
String release = android.os.Build.VERSION.RELEASE;
(30) 获取设备名称
public static String getDeviceName() {
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
LogCat.d("MANUFACTURER = " + Build.MANUFACTURER);
LogCat.d("MODEL = " + Build.MODEL);
LogCat.d("BRAND = " + Build.BRAND);
LogCat.d("PRODUCT = " + Build.PRODUCT);
LogCat.d("DEVICE = " + Build.DEVICE);
if (model.startsWith(manufacturer)) {
return capitalize(model);
} else {
return capitalize(manufacturer) + " " + model;
}
}
(31) 有时候出现,有时候又不出现的问题
最近在做一个PDF的项目,一个功能有时候有用,有时候没用;也没有报错;
这个时候可以思考的方向是线程阻塞了,Thread A没有执行完,Thread B调用它,此时肯定拿到的值不是处理完之后的值
所以将调用者稍微阻塞一下即可
(32)使用table后,textview使用wrap_content定义高度,但是长度后第二行部分显示不完全
这时候使用textview的一个行间距离属性定义即可
(33) 使用google map API 注意事项
1. 在google console中申请该项目使用google map的API。具体的,只要是跟MAP有关系的API都打开就好了
2. 测试的设备上一定要安装 有google play services
3. 确定使用的debug.keystore是你用来申请google map API的那个,否则地图不显示
(34) 相机镜头旋转90度方法
setDisplayOrientation(90);即可
(35) 判断设备是否为pad
private boolean isPad() {
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
// 屏幕宽度
float screenWidth = display.getWidth();
// 屏幕高度
float screenHeight = display.getHeight();
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
// 屏幕尺寸
double screenInches = Math.sqrt(x + y);
// 大于6尺寸则为Pad
if (screenInches >= 6.0) {
return true;
}
return false;
}
(36) 运行项目时碰到Error:Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
其实也不知道为什么,貌似是项目安装在设备上的版本号比代码中的版本号要高,这时候只要将项目的版本号改大即可
像这样~
android:versionCode="219"
android:versionName="2.1.9"
(37) textView 换行
设置 android:singleLine="false" 即可
(38) 获取本机电话号码/IMSI
public String getIMSI() {
String myIMSI = null;
try {
TelephonyManager telephonyManager = ((TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE));
// myIMSI = telephonyManager.getSubscriberId(); IMSI
myIMSI=telephonyManager.getLine1Number();
} catch (Exception e) {
}
return myIMSI;
(39) 添加第三方library总是失败
下面提到的两点都要注意,首先library要和项目放在同一个workspace里面,导入是一定记得选择将导入项目拷贝到workspace中。
其次,如果项目的API为19,那么引用的第三方包的Android API为20则一定导入失败,修改第三方包的Android API至少等于现在开发项目的API,或更低版本。
搞定之后Clean,再不行就关掉Eclipse再重新打开,有时候Eclipse重建项目会有滞后。
(41) 报错如下
Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/Buffer;
原因是项目使用了 commons-beanutils-1.8.3.jar 和 commons-collections-3.2.jar两个jar包,而这个两个包里面包含了相同的org.apache.common这个包,将beanutils里面的common包删了,保存,重新打开workspace载入即可
(42) 将编辑的照片存入手机成功,但在相册中不显示
这个问题很坑,想要见到照片的话重启即可
但不能每次为了查看照片都重启手机
于是用下面的广播可以解决问题
//Refresh the photo environment, sometimes the latest photos will not shown
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));