汪建军的博客

休迅飞凫,飘忽若神,凌波微步,罗袜生尘。

Android developer, sometimes thinking, sometimes try it.


Android开发路上的踩坑锦集(一)

  学习Android有3年了,从事Android开发也有两年多了,从一个小菜鸟到目前也成长了许多,期间踩过茫茫多的坑,大多数我都会记录下来。之前是用txt记录的,我尽量按照Markdown优化一下排版。目前有(一)、(二)、(三),是按照时间顺序来的,(一)的话可能会非常简单,因为那时候我就是一个初学者。不定期更新,以后可能会有(四)、(五)...


正文



用代码触发一个点击事件的代码:view.performClick();


proguard打混淆包要先编辑androidSDK根目录下tools\proguard\bin\proguard.bat 找到SET PROGUARD_HOME=
这个后面加上"目录。。\android-sdk-windows\tools\proguard"


获取APP及手机信息:

sb.append("\n软件版本:").append(mAppContext.getPackageInfo().versionName);
sb.append("\n手机型号:").append(android.os.Build.MODEL);
sb.append("\n系统版本:").append(android.os.Build.VERSION.RELEASE);

界面返回:Activity.this.finish();


TextView还能这样设置文字:

remain = (TextView) findViewById(R.id.comment_remain);
remain.setText(Html.fromHtmlsetText(Html.fromHtml("还能输入<font color='#29a5e5'>" + (100 - count) + "</font>个字"));

"\n" 换行


View view = LayoutInflater.from(MainActivity.this).inflater(R.layout.ly,null);

布局中用到了大量一样的东西就可以封装在style中,比如:

<style name="CommonTopRightButtonText">
<item name="android:textSize">14sp</item></style>

刷新数据:adapter.notifyDataSetChanged();

上面这个不用handler会有bug,简单的使用下面更新显示:

bm.clear(); // list

... // 更改list

adapter = new ImageAdapter(appContext); // adapter为全局

gridView.setAdapter(adapter);


//读取res下raw(新建)下的n_templetes.xml文件

getResources().openRawResource(R.raw.n_templetes);

//以流的方式读取字符串

new StringReader("abc");
new InputSource(new StringReader("abc"));

//设置drawable背景,将bitmap转换成drawable

setBackgroundDrawable(new BitmapDrawable(bitmap));


//设置textview(在RelativeLayout中)的高度

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)textView.getLayoutParams();  
layoutParams.height = 600;  

create table peopleinfo (_id integer primary key autoincrement,name text not null,age integer,height float);  

ImageView iv=new ImageView(context);  
iv.setScaleType(ImageView.ScaleType.FIT_XY);//Gallery在baseadapter按X轴旋转  
iv.setLayoutParams(new Gallery.LayoutParams(100,100));  

ListView的模板layout中的button要加上android:focusable="false",这样每一项和每一项中的按钮都能被点击


//得到"/mnt/sdcard/"

String myDir = Environment.getExternalStorageDirectory()+"/";  

2、handler.obtainMessage(99,i,0);

实现递增,while(true)或者for,循环制造几个Message就改变几次,线程休眠写在handler.sendMessage(msg)后面且在循环内。

new MyThread(handler).start();是可以的

Handler handler = new Handler(){ 。。。在onCreate方法前操作textview} 是可以的


3、游标的产生:

Cursor cursor = context.getContentResolver().query(..+ "=?"..CONTACT_ID...);

Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);

ContentResolver cr = getContentResolver();

Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null, null, null, null);

while(cursor.moveToNext()){

String ALBUM = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));

sb.append("ALBUM:"+ALBUM).append("\n");

}

或者:

Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;

 Cursor cursor = context.getContentResolver().query(uri,null,
 ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?",
 new String[]{String.valueOf(id)}, null);

startManagingCursor(cursor);我们将获得的Cursor对象交由Activity管理,这样Cursor的生命周期和Activity便能够自动同步,省去自己手动管理Cursor


用tomcat部署到本机上,android认为localhost本机地址为10.0.2.2,而不是127.0.0.1


文件放到webapps里面,路径不用加/webapps


这种方法可以很容易地加载到任意大尺寸的位图显示一个100x100像素的缩略图ImageView ,如下面的代码示例所示:

mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

javabean实现序列化接口implements Serializable 后就可以被intent传递:intent.putExtra(name,Serializable);


比如在service中接收:Mp3Info mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");


javabean这些自定义对象只能通过Serializable序列化传递(bundle使用举例:


Bundle bundle = new Bundle(); //保存输入的信息 bundle.putString("name", info); intent.putExtras(bundle);


在另外的Activity中:Bundle b=getIntent().getExtras(); //获取Bundle的信息 String info=b.getString("name");


adb shell失败是path环境变量没有配置android的tools,!!关掉腾讯的:tadb!!连接不上魅族mx2是没有安装手机驱动,下载个豌豆荚能自动安装,然后eclipss的ddms就能检测到了


Demo中一个类百度不到,看看是不是自定义的类


用gallery画廊要在values中新建一个attrs.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

      <declare-styleable name="Gallery">

 <attr name="android:galleryItemBackground"></attr>

 </declare-styleable>

</resources>  

监听事件要set,不要犯低级错误,如:findPreference("c").setOnPreferenceClickListener(this);


context参数不止可以填this或者Main.this还可以写view.getContext();


为gallery设置样式,在适配器的构造方法中:

 TypedArray typedArray = context.obtainStyledAttributes(R.styleable.Gallery);

 mGralleyItemBackground = typedArray.getResourceId(

 R.styleable.Gallery_android_galleryItemBackground, 0);

而且还要在getView方法中加上:imageView.setBackgroundResource(mGralleyItemBackground);


6、在代码中获取屏幕像素、屏幕密度

DisplayMetrics metric = new DisplayMetrics(); 

getWindowManager().getDefaultDisplay().getMetrics(metric); 

int width = metric.widthPixels;  // 屏幕宽度(像素) 

int height = metric.heightPixels;  // 屏幕高度(像素) 

float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 

int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)  

1、AsyncTask

改善你的设计,少用异步处理

与主线程有交互时用AsyncTask,否则就用Thread:AsyncTask被设计出来的目的就是为了满足Android的特殊需求:非主线程不能操作(UI)组件,所以AsyncTask扩展Thread增强了与主线程的交互的能力。如果你的应用没有与主线程交互,那么就直接使用Thread就好了。

当有需要大量线程执行任务时,一定要创建线程池

Task的实例必须在UI thread中创建,该task只能被执行一次,否则多次调用时将会出现异常

AsyncTask在代码上比handler要轻量级别,而实际上要比handler更耗资源,因为AsyncTask底层是一个线程池!而 Handler仅仅就是发送了一个消息队列,连线程都没有开。


EditText设置输入监听实现还能输入多少字:

content = (EditText) findViewById(R.id.comment_content);

 content.addTextChangedListener(new TextWatcher() {

                 。。。。。

 @Override

 public void afterTextChanged(Editable s) {

 int count = content.getText().toString().length();

 remain.setText(Html.fromHtml("还能输入<font color='#29a5e5'>" + (100 - count) + "</font>个字"));}});

Intent intent = new Intent();

/* 开启Pictures画面Type设定为image */

intent.setType("image/*");

/* 使用Intent.ACTION_GET_CONTENT这个Action */

intent.setAction(Intent.ACTION_GET_CONTENT);

/* 取得相片后返回本画面 */

startActivityForResult(intent, PHOTO_WITH_DATA);



new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");  

;E:\JDK\bin;E:\JDK\lib;E:\mysql\bin;E:\MySQL\MySQL Server 5.5\bin;F:\Program Files\MySQL\MySQL Server 5.5\bin;E:\Program Files\MySQL\MySQL Server 5.5\bin;E:\QQPCMgr\6.8.2388.401;F:\android-sdks\platform-tools;


win81_path:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;E:\mysql\bin;E:\MySQL\MySQL Server 5.5\bin;F:\Program Files\MySQL\MySQL Server 5.5\bin;E:\Program Files\MySQL\MySQL Server 5.5\bin;E:\QQPCMgr\6.8.2388.401;F:\android-sdks\platform-tools;%JAVAHOME%\bin;%JAVAHOME%\jre\bin;

最近的文章

Android开发路上的踩坑锦集(二)

为方便更新(二)是倒序记录的,因为每一条都有数字标注就不用分割线了。 99、httpClient设置UA,在全局的httpClient设置就好了: defaultHttpClient.getPara…

Android笔记继续阅读
更早的文章

及时同步ss密码

我喜欢用shadowsocks当梯子,前阵子发现有个网站能提供免费的ss账号密码,但是这个密码每6小时更换一次(它是这么说,但是不一定,有时候可能很快就换了),维仔说这么麻烦!于是我动手写了个让更换密…

举个例子继续阅读
comments powered by Disqus