您的位置:首页 > 移动开发 > Android开发

Android开发遇到的一些小坑洼

2015-06-21 18:26 387 查看
1、因为设计要求把加载loading放到按钮中,但是又怕设计临时改主意添花样所以自定义了一个View继承了RelativeLayout,布局中设定了固定宽高,但是问题来了,无论在布局文件中怎么设置宽高都是无效的,最后对比同事的自定义文件发现我少设置了Params。。。,只要在addView的时候设置宽高为math_parent,控件就会根据布局文件中设置的宽高显示了

LayoutParams lp=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
this.addView(rootLayout,lp);


2、因为要做按钮滑到底部显示,滑到顶部消失的效果,我的小伙子同事头疼了半天,设置了显示之后设置Visible是Gone就是不消失,后来发现只要给ImgeView设置了动画再设置Visible就不管用了,具体原理没搞清。。所以设置之前要清除动画才行

btn.clearAnimation();                   btn.setVisibility(View.VISIBLE);


在需要动画的地方再设置开启动画就行了

btn.setAnimation(animation);
animation.start();


3、因为在开启界面时就进行了数据初始化所以打开界面会有些卡顿所以决定用AsyncTask,因为有多个地方用到了一块代码,所以为了传教多个对象,我创建好了一个AsyncTask对象之后每次开启就好了。。。。但是事实不是我想的那样的,第二次调用就会抛出异常:Cannot execute task:the task has alreday executed,很明显一个AsyncTask对象只能执行一次The Task can be executed only once。所以将需要调用的代码抽离出方法,每次需要的时候重新new一个AsyncTask对象执行。

我们将执行的方法弄成公共方法,每次将AsyncTask对象传给它执行

public class TaskUtils {
public static <Params, Progress, Result> void executeAsyncTask(
AsyncTask<Params, Progress, Result> task, Params... params) {
if (Build.VERSION.SDK_INT >= 11) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
task.execute(params);
}
}
}


使用时:

TaskUtils.executeAsyncTask(new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
//do something you want,-_-
}
});


4、还是AsyncTask的问题,因不知名原因AsyncTask突然就不回调了,onPostExecute方法不执行,因为也是好几个人一起开发,不清除哪里出了问题,纠结了好几天才终于找到了原因,因为我们将极光推送的jar包换成了1.7版本。。。还回去就好了,不过这样可不是回事儿,最后在Application中添加代码,自己加载AsyncTask类(这个问题是同事解决的,我还要继续学习才行啊)

try{
Class.forName("android.os.AsyncTask");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}


先整理这些,赞一下MarkDown编辑器,比以前方便好多!

5、代码中设置TextView的字号时无论是用网友的方法px转成sp还是sp转成px设置在不一样分辨率的手机上大小差的实在是悬殊,后来发现原来TextView已经有了设置字号模式的方法,textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);即设置了16sp的单位,可以根据自己的需要设置是sp、px、dpi等等。

6、设置TextView控件可复制,在xml布局中添加属性android:textIsSelectable=”true”即可。

7、在有的机型中将一个界面横屏后会将之前已经开启的界面全部销毁重现创建一遍,但是我遇到了一个问题,就是我在最底部大activity里的一个fragment中开启了一个判断是否需要去刷新数据的线程,通过onResume、onPause、setUserVisibleHint中判断是否可刷新,但当最上方的activity横屏后带有线程的fragment也重现创建了,而且最后回调的setUserVisibleHint中是否可见的标志变成了true,所以会在后台一直刷新数据。。。解决办法:在不希望重新创建的activity的AndroidManifest.xml声明时添加android:configChanges=”orientation|screenSize”属性即可,如果希望保险些就多写些情况android:configChanges=”orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden”,

(1)keyboard:The keyboard type has changed — for example, the user has plugged in an external keyboard.

键盘类型发生改变,例如,用户使用了外部键盘

(2)keyboardHidden:The keyboard accessibility has changed — for example, the user has revealed the hardware keyboard.

键盘发生改变,例如,用户使用了硬件键盘

(3)screenSize: 屏幕大小改变了

smallestScreenSize: 屏幕的物理大小改变了,如:连接到一个外部的屏幕上

(4)orientation:The screen orientation has changed — that is, the user has rotated the device.设备旋转,横向显示和竖向显示模式切换。

不过目前还不清楚为什么只写orientation不管用。。。

属性介绍文章参考:/article/6551077.html

8、ScrollView需设置fillViewport属性为true布局才会充满屏幕,否则即使设置了height为mathch_parent 也是无用的。

9、在给ImageView时希望最大不超过一定的尺寸,需设置maxWith或maxHeight控制,但单设置这两个值是不起作用的,需要设置android:adjustViewBounds=”true”。

10、为EditText设置只能输入字母和汉字,之前用TextChangeWatcher各种判断。。。,其实只给EditText设置过滤器就行了,et_x.setFilters(new InputFilter[]{onlyLetter});,这个onlyLetter即为你想要的过滤器,如我的需求是字母和汉字:

InputFilter onlyLetter = new InputFilter() {
//只能输入字母和汉字的过滤器
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if ( !Character.isLetter(source.charAt(i)))
{//Character.isLetter和isLetterOrDigit会把中文也当做Letter。
return "";
}
}
return null;
}
};


更多内容请参照/article/8544075.html的博客

11、日期格式转换问题,现在服务器经常会返回类似Jul 31,2015 12:00:00 AM或11/13/2015 03:36:51 PM等等模式的日期字符串,但ui上的显示格式则不同,需要转换,像这样的英国模式的~~需要Eglish模式的SimpleDateFormat处理,如下:

public static final SimpleDateFormat english_df = new SimpleDateFormat("MMM d, yyyy K:m:s a", Locale.ENGLISH);
public static final SimpleDateFormat english_df2 = new SimpleDateFormat("dd/MM/yyyy K:m:s a", Locale.ENGLISH);
public static final SimpleDateFormat df2Date2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 将Jul 31,2015 12:00:00 AM格式的字符串转化成 2015-08-03 12:00:00格式
* @param str
* @return
*/
public static String english2Day(String str){
try{
Date date=english_df.parse(str);
return df2Date2.format(date.getTime());
}catch (Exception e){
e.printStackTrace();
}
return null;
}


12、有些设备上底部有虚拟键(即虚拟导航栏),会遮盖界面,这时我们可以隐藏虚拟键,但是用户触摸屏幕后还是会显示出来的,且方法sdk14才可以用,代码如下,需在setcontentview之前设置:

if (android.os.Build.VERSION.SDK_INT >= 14) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: