解决webview显示图片分辨率的方法
例如适合800px宽度的页面,如果通过WebView在1024px的屏幕宽度下显示时,内容(图片)会被放大,整体页面会超出屏幕。
试了将WebView的settings中的缩放都关闭了也不行。
后来发现了WebSettings.ZoomDensity这个设置,并在文档中找到了以下说明:
Enum for specifying the WebView's desired density. FAR makes 100% looking likein 240dpi MEDIUM makes 100% looking like in 160dpi CLOSE makes 100% lookinglike in 120dpi
这样就能很好的说明以上问题的原因了,又是密度惹的祸...
默认WebView的ZoomDensity是MEDIUM,对应160dpi。而我之前800px宽度的屏幕对应的是60dpi,1024px宽度的屏幕对应的是240dpi。所以,页面在高分辨率的屏幕上被放大了1.5倍。这个和图片自缩放的机制是一样的。
于是,只要通过当前屏幕的密度,动态设置该属性就能适应不同屏幕(当然,默认你的页面是针对160dpi的密度大小设计的),即可解决:
/////////////////////////////////////////////////////////////////////
int screenDensity =getResources().getDisplayMetrics().densityDpi ;
WebSettings.ZoomDensityzoomDensity = WebSettings.ZoomDensity.MEDIUM ;
switch (screenDensity){
case DisplayMetrics.DENSITY_LOW :
zoomDensity = WebSettings.ZoomDensity.CLOSE;
break;
case DisplayMetrics.DENSITY_MEDIUM:
zoomDensity = WebSettings.ZoomDensity.MEDIUM;
break;
case DisplayMetrics.DENSITY_HIGH:
zoomDensity = WebSettings.ZoomDensity.FAR;
break ;
}
webView.getSettings().setDefaultZoom(zoomDensity);//webSettings.setDefaultZoom(zoomDensity);
解决SQLITE数据库查找速率的方法
通常有些查找算法是无法通过事物来提高速度的
数据库算法应尽量减少movetofrist语句,因为查找语句的真正运行是在movetofrist执行时运行的,因此,用IN语句来代替for与LIKE的组合能够大幅度提高查找速率
For(i)
{
Sqlite(LIKE String[i])
}
Replaced by:
For(i)
{
String[i]+String[i+1]……
}
Sqlite(IN)
android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:
1、Drawable → Bitmap
Java代码
- publicstaticBitmapdrawableToBitmap(Drawabledrawable){
- Bitmapbitmap=Bitmap
- .createBitmap(
- drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(),
- drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888
- :Bitmap.Config.RGB_565);
- Canvascanvas=newCanvas(bitmap);
- //canvas.setBitmap(bitmap);
- drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
- drawable.draw(canvas);
- returnbitmap;
- }
2、从资源中获取Bitmap
Java代码
- Resourcesres=getResources();
- Bitmapbmp=BitmapFactory.decodeResource(res,R.drawable.pic);
3、Bitmap → byte[]
Java代码
- privatebyte[]Bitmap2Bytes(Bitmapbm){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- bm.compress(Bitmap.CompressFormat.PNG,100,baos);
- returnbaos.toByteArray();
- }
4、 byte[] → Bitmap
Java代码
- privateBitmapBytes2Bimap(byte[]b){
- if(b.length!=0){
- returnBitmapFactory.decodeByteArray(b,0,b.length);
- }
- else{
- returnnull;
- }
- }
以上是我在实践中遇到的一些转换,以后遇到类似的就不用到处找了,希望对大家也有一点用处!
系统摄像头调用
·protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)方法即可
·
· 如:
·
·finalintTAKE_PICTURE=1;
·protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
·if(requestCode==TAKE_PICTURE){
·if(resultCode==RESULT_OK){
·Bitmapbm=(Bitmap)data.getExtras().get("data");
·imgPhoto.setImageBitmap(bm);
·sdCardExit=Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
·
·if(sdCardExit){
·myRecAudioDir=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/custom_picture");
·
·if(!myRecAudioDir.exists()){
·myRecAudioDir.mkdir();
· }
·}else{
·mMakeTextToast("",true);
·}
·
·try{
·Filef=File.createTempFile(strTempFile,".jpg",myRecAudioDir);
·BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(f));
·
·photoPath=f.getPath();
·
·bm.compress(Bitmap.CompressFormat.JPEG,80,bos);
·
·bos.flush();
·bos.close();
·
·}catch(FileNotFoundExceptione){
·e.printStackTrace();
·}catch(IOExceptione){
·e.printStackTrace();
·}
·}
·}
· }
在HTML的图片编辑中,图片可能会有超屏的现象
解决方法:
<img style="max-width:100%" src =CKJF0019-01.png ></img>
此设置100%指的是屏幕宽度的100%,并不是指原图的100%,所以,很好用!
webview中图片的居中属性
在图文混排时,使用<imgAlign="absmiddle" src=""/>可以让超过一行文字高度的图片居中显示,更有利于公式等图片的排版显示
反射获取对象属性的方法
Class<?>ownerClass = Class.forName("org.sqlite.RS");
java.lang.reflect.Fieldinstance = SrcCur1.getClass().getDeclaredField("cols");
instance.setAccessible(true);//必要的设置
String[] last= (String[]) instance.get(SrcCur1);
instance.setAccessible(false);//必要的设置
Android webview中,HTML的<IMG>标签SRC
在webview中,可以直接将<IMG>标签中src指向android工程目录
e.g.
<img id='flash' src = 'file:///android_asset/UI/flash.png'style='height:20px'>
将自己的软件加入到列表
使用过Android设备的朋友当我们要打开某个文件。这里以文本为例,有的时候会弹出一个列表,选择使用其中一个软件来打开文本。作为开发人员如何将自己的软件加入到列表中呢。
我们通过设置AndroidManifest.xml文件即可代码如下:
<activity
android:label="@string/app_name"
android:launchMode="singleTask"
android:name=".EsayNoteActivity"
android:screenOrientation="portrait">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<actionandroid:name="android.intent.action.VIEW"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:mimeType="text/plain"/>
</intent-filter>
</activity>
这样当打开文本文件的时候我们自己的软件就在列表里了
主要是设置mimeType的类型,文本文件是:text/plain
在配置中程序设置关联之后,还有参数传递问题需要在onCreate()里面添加如下代码:
Java代码
Intentintent=getIntent();
Stringaction=intent.getAction();
if(Intent.ACTION_VIEW.equals(action)){
TextViewtv=(TextView)findViewById(R.id.tvText);
tv.setText(intent.getDataString());//显示文件路径
}
常用的类型还有:
text/plain(纯文本)
text/html(HTML文档)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
image/png(PNG图像)【PHP中为:image/x-png】
video/mpeg(MPEG动画)
application/octet-stream(任意的二进制数据)
application/pdf(PDF文档)
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)
TextView对HTML标签的支持
方法如下,使用HTML转换即可
TextView x = (TextView)findViewById(R.id.textView1);
x.setText(Html.fromHtml("djwai<br>dojawidoawdaw"));
注:不一定支持所有标签。
隐式调用判断action是否存在
隐式调用如果被调用action来自外部AP,且没有被安装,就会出现当机情况,加入判断语句即可解决问题
Intent intent = new Intent();
intent.putStringArrayListExtra("unitnumberarray",IOArray);
intent.setAction("com.besta.app.knowledge.twchemistry.KNOWLEDGE1");
if(getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY).size()>0)
{
startActivity(intent);
}
else
{
Toast.makeText(this,"Thefunction is not found!",Toast.LENGTH_SHORT).show();
}
公共存储区域
在android中,如果有些AP需要计数器等,但又不想创建文件读取,那么可以使用其公共内存存储区域Push键值对进去,很是方便
PageCount =getPreferences(MODE_PRIVATE).getInt("pagecount", 0);
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
editor.putInt("pagecount",--PageCount);
editor.commit();
数据库关闭报错
数据库关闭报错有很多种,有如下一种其情况:
04-0109:46:07.922: E/AndroidRuntime(8383): android.database.sqlite.SQLiteException:unable to close due to unfinalised statements
这是由于游标未被关闭导致,很多人在使用数据库时都会忘记关闭游标,这样在游标未操作完成(而你以为操作完成)的情况下关闭数据库,则会有当机的风险。
SQLiteDatabase db = null;
db = SQLiteDatabase.openDatabase(dbPath,null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
String dbcommand = "SELECT * FROM CSS WHERE filename LIKE \""+ cssFileName +"\"";
Cursor cssCur = db.rawQuery(dbcommand, null);
if(cssCur != null )
{
if(cssCur.moveToFirst())
{
cssString =cssCur.getString(cssCur.getColumnIndex("content"));
}
}
cssCur.close();//一定要记得关闭!!
db.close();
【HTML】表格自动换行
Kay'sword: 看了无数,发现就这个能用,主要在table和td的属性里加上
<tablestyle="TABLE-LAYOUT:fixed;word-break:break-all;word-wrap:break-all;"……>
<tdstyle="word-break:break-all;word-wrap:break-word;"……>
用表格做网页排版的时候,一般都能正常使用。偏偏有时会碰到一段连续的英文词或者一堆感叹号(!!!)把网页就撑开的现象:(
总结了一下,只要在CSS中定义了如下句子,可保网页不会再被撑开了。
table{table-layout: fixed;}
td{word-break: break-all; word-wrap:break-word;}
注释一下:
1.第一条table{table-layout: fixed;},此样式可以让表格中有!!!(感叹号)之类的字符时自动换行。
2.td{word-break: break-all},一般用这句这OK了,但在有些特殊情况下还是会撑开,因此需要再加上后面一句(word-wrap:break-word;)就可以解决。此样式可以让表格中的一些连续的英文单词自动换行。
语法:
word-break : normal | break-all | keep-all
参数:
normal : 依照亚洲语言和非亚洲语言的文本规则,允许在字内换行
break-all : 该行为与亚洲语言的normal相同。也允许非亚洲语言文本行的任意字内断开。该值适合包含一些非亚洲文本的亚洲文本
keep-all : 与所有非亚洲语言的normal相同。对于中文,韩文,日文,不允许字断开。适合包含少量亚洲文本的非亚洲文本
语法:
word-wrap : normal | break-word
参数:
normal : 允许内容顶开指定的容器边界
break-word : 内容将在边界内换行。如果需要,词内换行(word-break)也行发生
说明:
设置或检索当当前行超过指定容器的边界时是否断开转行。
对应的脚本特性为word-wrap。请参阅我编写的其他书目。
语法:
table-layout : auto | fixed
参数:
auto : 默认的自动算法。布局将基于各单元格的内容。表格在每一单元格读取计算之后才会显示出来。速度很慢
fixed : 固定布局的算法。在这算法中,水平布局是仅仅基于表格的宽度,表格边框的宽度,单元格间距,列的宽度,而和表格内容无关
说明:
设置或检索表格的布局算法。
对应的脚本特性为tableLayout。
【HTML】JS返回顶部代码
查看sqlite3表结构的命令
在android下通过adb shell命令可以进入sqlite3的命令行client,见:在android命令行下使用sqlite3。
如果想列出该数据库中的所有表,可:
.table
如果想查看这些表的结构:
select * from sqlite_master where type="table";
可以看到类似:
默认情况下,不会出现红框中的表头,需要之前设置,命令为:
.header on
如果只想查看具体一张表的表结构,比如查看emperors表,命令为:
select * from sqlite_master where type="table" andname="emperors";
另外,也可以这样:
sqlite> .schema emperors
CREATE TABLE emperors( id integer primary key autoincrement, name text,dynastytext,start_year text);
Android http GET URL字符转义
当在android采用GET方式的url来传值时,需要使用URLEncoder来将字符转义
e.g.
URLEncoder.encode("getTitle","utf-8")
Android Holo 主题 — 开发者的中立主题
还记得3个月前被手机厂商炒的沸沸扬扬的关于Android将统一界面的新闻报道吗?当时再加上Android 3.0的闭源开发,很多手机厂商和开发者都认为Google不想为他人做嫁衣,想进一步控制Android系统的发展,减少Android版本分化给用户和开发者照成的迷惑。
今天Android Framework团队开发者AdamPowell发表文章说,Android不会闭源, 统一界面是通过4.0引入的Holo主题来实现的。 在4.0+的系统上,所有要兼容Android CTS的手机系统都需要内置一个不可修改的Holo主题,开发者在开发程序的时候可以指定是使用Holo主题还是使用各个设备上的默认主题;同时为了便于手机厂商自定义界面,Android 4.0还引入了一个DeviceDefault主题,通过这种方式把设备主题和Holo主题分开,让手机厂商自定义界面和版本升级更加容易。
开发者可以在程序的Manifest文件中指定使用Holo主题,android:theme="@android:style/Theme.Holo.*",为了和以前的版本兼容,可以通过版本限定符(vN)来设置在不同的版本中使用不同的主题,如下:
在 res/values/themes.xml 中使用如下自定义主题:
1 2 3 4 5 |
|
在 res/values-v11/themes.xml 中使用自定义主题,注意这里的v11限定符:
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 |
|
其实通过这种方式来解决这个第三方UI的问题,是个很不错的想法, 很多开发者都为了简单在4.0版本上都只使用Holo主题,这样就会导致厂商开发的自定义UI只在自己的设备上使用。最终的理想情况是:每个厂商开发的自定义UI只有他们自己的系统和内置的程序使用自定义的UI,而其他程序都使用Holo主题, 久而久之 手机厂商做自定义UI的激情也没有了, 从而实现了Android界面统一的终极目标。
程序文件修改
修改完資源文件的內容,下面來修改程序中的不兼容代碼,告訴你個快捷尋找不兼容代碼的方法,你把程序從minSdkVersion:14改成minSdkVersion:10,然後去把裏面所有紅色的代碼都加上try,catch。示例:
try{
//4.0 code
}catch(NoClassDefFoundError e) {
//2.3code}
public
voidsetNotify() {
if(!mIsNotify) {
return;
}
Intent intent =newIntent(getApplicationContext(),Management.class);
intent.putExtra(AppConstants.CommonArgs.UPDATE_FLAG,true);
//intent.putParcelableArrayListExtra("appList",
// UpdateData.gUpdateList);
PendingIntentcontentIntent = PendingIntent.getActivity(
getApplicationContext(), 0, intent, 0);
String tickerFormat= getString(R.string.notification_ticker);
NotificationmNotification =null;
NotificationManagermyNotificationManager = (NotificationManager)CheckLocalUpdateService.this
.getSystemService(NOTIFICATION_SERVICE);
try{
mNotification =newNotification.Builder(
CheckLocalUpdateService.this)
.setContentTitle(getText(R.string.notification_title))
.setContentText(String.format(tickerFormat,mUpdateList.size()))
.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.icon_stat)
.setAutoCancel(true)
.setTicker(String.format(tickerFormat,mUpdateList.size()))
.setNumber(mUpdateList.size())
.setWhen(System.currentTimeMillis()).getNotification();
}catch(NoClassDefFoundError e) {
mNotification =newNotification(R.drawable.ic_launcher,
String.format(tickerFormat,mUpdateList.size()),
System.currentTimeMillis());
mNotification.flags= Notification.FLAG_AUTO_CANCEL;
mNotification.setLatestEventInfo(CheckLocalUpdateService.this,
getString(R.string.notification_title),
String.format(tickerFormat,mUpdateList.size()),contentIntent);
mNotification.number=mUpdateList.size();
}
myNotificationManager.notify(
AppConstants.CommonArgs.UPDATE_NOTIFICATION_ID,mNotification);
}
android listview ScrollView冲突 listview checkbox
博客分类:
1、解决问题:
加了checkbox之后,就会影响setOnItemClickListener(newOnItemClickListener() 不起作用。
办法:checkbox默认设置:android:focusable="false"
2、解决问题:
Java代码
1.Infoinfo=list.get(position);
2.viewHolder.checkBox.setChecked(info.getCheckState());
3.viewHolder.checkBox.setOnCheckedChangeListener(newCheckListener(info));