解决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
- public static Bitmap drawableToBitmap(Drawable drawable) {
- Bitmap bitmap = Bitmap
- .createBitmap(
- drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(),
- drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
- : Bitmap.Config.RGB_565);
- Canvas canvas = new Canvas(bitmap);
- //canvas.setBitmap(bitmap);
- drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- drawable.draw(canvas);
- return bitmap;
- }
2、从资源中获取Bitmap
- Resources res=getResources();
- Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
3、Bitmap → byte[]
- private byte[] Bitmap2Bytes(Bitmap bm){
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
- return baos.toByteArray();
- }
4、 byte[] → Bitmap
- private Bitmap Bytes2Bimap(byte[] b){
- if(b.length!=0){
- return BitmapFactory.decodeByteArray(b, 0, b.length);
- }
- else {
- return null;
- }
- }
以上是我在实践中遇到的一些转换,以后遇到类似的就不用到处找了,希望对大家也有一点用处!
系统摄像头调用
· protected void onActivityResult(int requestCode, int resultCode, Intent data)方法即可
·
· 如:
·
· final int TAKE_PICTURE = 1;
· protected void onActivityResult(int requestCode, int resultCode, Intent data) {
· if (requestCode == TAKE_PICTURE) {
· if (resultCode == RESULT_OK) {
· Bitmap bm = (Bitmap) data.getExtras().get("data");
· imgPhoto.setImageBitmap(bm);
· sdCardExit = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
·
· if (sdCardExit) {
· myRecAudioDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/custom_picture");
·
· if (!myRecAudioDir.exists()) {
· myRecAudioDir.mkdir();
· }
· } else {
· mMakeTextToast("", true);
· }
·
· try {
· File f = File.createTempFile(strTempFile, ".jpg",myRecAudioDir);
· BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f));
·
· photoPath=f.getPath();
·
· bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
·
· bos.flush();
· bos.close();
·
· } catch (FileNotFoundException e) {
· e.printStackTrace();
· } catch (IOException e) {
· 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 >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
这样当打开文本文件的时候我们自己的软件就在列表里了
主要是设置mimeType的类型,文本文件是:text/plain
在配置中程序设置关联之后,还有参数传递问题需要在onCreate()里面添加如下代码:
Java代码
Intent intent = getIntent();
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
TextView tv = (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返回顶部代码
本文介绍三款简单的返回页面顶部代码,可以使用简单的HTML锚标记,也可使用Javascript Scroll函数动态返回,其它的还有悬浮脚本等有点复杂了,本文不再介绍,大家根据自己需要选择其中的一种即可,总之简约最美的,能减少代码就减少代码,能不调用的就别调用,要不是天缘博客的文章都是牛长也不会添加这个功能。 一、使用锚标记返回页面顶部使用HTML锚标记最简单,就是看起来有点不好看,点击后会在地址栏显示这个锚标记,其它的倒没什么。 页面顶部放置: <a name="top" id="top"></a> 放置位置在<body>标签之后随便找个地方放都可以,只要靠近顶部即可。 页面底部放置: <a href="#top" target="_self">返回顶部</a> 二、使用Javascript Scroll函数返回顶部scrooll函数用来控制滚动条的位置,有两种很简单的实现方式: 方式1:
scroll第一个参数是水平位置,第二个参数是垂直位置,比如要想定位在垂直50像素处,改成scroll(0,50)就可以了。 方式2: 本方式是渐进式返回顶部,要好看一些,代码如下:
这样就会动态返回顶部,不过虽然返回到顶部但是代码仍在运行,还需要在pageScroll函数加一句给停止掉。
三、使用Onload加上scroll功能实现动态返回顶部1、首先在网页BODY标签结束之前加上: <div id="gotop">返回顶部</div> 2、再调用以下JS脚本部分:
对Z-BLOG而言,可以放到$(document).ready(function(){....函数中,也可以独立存成一个js文件,比如gotop.js,再通过: <SCRIPT src="/js/gotop.js" type=text/javascript></SCRIPT> 来调用,当然了位置最好放在“返回顶部”标签的下面,该调用方法已假设路径为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 = new Intent(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 = new Notification.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 = new Notification(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、解决问题:
1. Info info = list.get(position);
2. viewHolder.checkBox.setChecked(info.getCheckState());
3. viewHolder.checkBox.setOnCheckedChangeListener(new CheckListener(info));