[转载]Asp.net中如何删除cookie?

mikel阅读(804)

[转载]Asp.net中如何删除cookie? – goody9807 – 博客园.

不能直接删除用户计算机中的 Cookie。但是,可以通过将 Cookie 的到期日期设置为过去的日期,让用户的浏览器来删除 Cookie。当用户下一次向设置该 Cookie 的域或路径内的页发出请求时,浏览器将确定该 Cookie 已到期并将其移除。

调用 Cookies集合的 Remove方法可从服务器端的集合中移除 Cookie,使 Cookie 不会被发送至客户端。但是,如果客户端已存在 Cookie,则

向 Cookie 分配已过去的到期日期
  1. 确定 Cookie 是否存在,如果存在则创建同名的新 Cookie。
  2. 将 Cookie 的到期日期设置为过去的某一时间。
  3. 将 Cookie 添加到 Cookies 集合对象。

    下面的代码示例演示如何为 Cookie 设置已过去的到期日期。

    Visual Basic
    If (Not Request.Cookies(“UserPreferences1”) Is Nothing) Then
    Dim myCookie As HttpCookie
    myCookie = New HttpCookie(“UserPreferences1”)
    myCookie.Expires = DateTime.Now.AddDays(-1D)
    Response.Cookies.Add(myCookie)
    End If
    if (Request.Cookies[“UserSettings”] != null)
    {
    HttpCookie myCookie = new HttpCookie(“UserSettings”);
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
    }

编译代码

此示例需要:

  1. 一个 ASP.NET 网页。
  2. 一个先前编写的名为 UserSettings 的 Cookie,

可靠编程

出于安全原因,您只能读取属于同一域的页所设置的 Cookie。如果已经设置 Cookie 的 Path属性,则该 Cookie 也只能用于该域路径内的页和子文件夹。

在读取特定 Cookie 值时,请测试该 Cookie 是否存在以及它是否具有值,否则将发生异常。

[转载]Android开发小知识文章目录

mikel阅读(817)

[转载]Android开发小知识文章目录 – qixiinghaitang – 博客园.

1

缩小Android模拟器的显示尺寸

2

图解LogCat的用法

3

学习Android界面设计的超级利器HierarchyView.bat

4

android:gravity和android:layout_gravity区别

5

Android界面开发推荐颜色

6

如何在Android模拟器中安装和卸载程序

7

初学解惑,最新的Android开发工具包可以用来开发老版本的程序吗?

8

使用ScrollView实现滚动效果

9

在Android中制作没有标题条的窗口

10

如何在Eclipse中看Android2.2的源码

11

在Android中使用自定义图片按钮

12

获取别人Android程序中的图片资源的方法

13

Android2.2系统中自带的图片资源

14

Android2.2中系统自带样式styles.xml的源代码

15

Android2.2中系统自带主题themes.xml的源代码

16

去移动MM学院开发人员在线考试测一下自己的分数

17

Android2.2中match_parent和fill_parent是一个意思

18

Android源代码下载指南(图解)

[转载]11款有用的Web开发在线工具

mikel阅读(759)

[转载]11款有用的Web开发在线工具_IT新闻_博客园.

作为Web开发者,我发现我非常依赖于一些在线工具。在线工具通常是易于创建和使用,并且可以使工作表现的更好、更快。

比如htaccess generator、JSON formatter。以下是我分享的一些新的、有趣的在线工具。

Font comparer

clip_image001

仅是输入一些文字,,来查看它的不同样式。

Color Explorer

clip_image002

通过ColorExplorer,你可以快速、轻松的创建、管理和评估调色,当你使用图片设计、Web设计、布局等时。

SpriteBox

clip_image003

SpriteBox是个WYSIWYG工具,来帮助Web开发者快速、轻松的创建CSS类。

Gridulator

clip_image004

Gridulator可以快速创建网格布局,在png上,帮助你进行Web布局。你会发现photoshop都不顶用的功能。

Markup.io

clip_image005

Markup可以让你通过一组工具在任何的网页上勾画等简单编辑,来表达你的想法。然后你可以通过书签工具栏来在任何时候掉使用它。

Spritebaker

clip_image006

一款针对web开发者和设计师的免费工具。它解析你的css,通过外部媒体“baked”返回一个副本,作为Base64编码数据集。消耗Http请求的时间将大量缩减,大量提升速度(服务器端必须gzip压缩)。

ProCSSor

clip_image007

高级CSS“美化师”,通过严格的方式格式化CSS。 将你的CSS转化为更引人注目的东西,只需一点点的努力。

Minus

clip_image008

拖曳的快速分享工具。

CopyPaste Character

clip_image009

复制、粘贴Web特殊字符的工具。

Name Check

clip_image010

检查你想要的昵称是否能注册的工具,支持数十个流行的社交网站。通过namechk找到最佳用户名。

Scrim

clip_image011

转化email地址为短域名,你可以在各类网站分享它,并且可以规避暴漏邮箱地址,而导致垃圾邮件泛滥。

原文:http://www.queness.com/post/7018/11-useful-online-tools-for-web-development

[转载]Android ListView性能优化之视图缓存(续)

mikel阅读(996)

[转载][Android]ListView性能优化之视图缓存(续) – 农民伯伯 – 博客园.

前言

在上一篇ListView性能优化之视图缓存我们讨论了Google I/O中的优化方法,在各个论坛发帖后得到了不错的反馈,诸如:使用ViewHolder技术Tag的问题,利用HashMap自行存储的方案等。这里结合新浪微博中主界面的做法及测试数据与大家进一步探讨。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com

农民伯伯: http://over140.cnblogs.com

文章

[Android]ListView性能优化之视图缓存 [本文的上篇]

[Android]ListView性能优化之视图缓存 [JavaEye讨论帖]

正文

一、新浪微博

1.1  截图

(来自网络)

1.2  反编译后相关代码

public View getView(int paramInt, View paramView, ViewGroup paramViewGroup)
{
int i = --paramInt;
int j = -1;
if (i == j);
for (Object localObject1 = HomeListActivity.this.getReloadView(); ; localObject1 = HomeListActivity.this.getLoadMoreView())
{
label26: return localObject1;
int k = HomeListActivity.this.mList.size();
int l = paramInt;
int i1 = k;
if (l != i1)
break;
}
boolean bool1 = true;
boolean bool2 = null;
String str1;
label110: Object localObject2;
if (StaticInfo.mUser == null)
{
List localList1 = HomeListActivity.this.mList;
int i2 = paramInt;
str1 = ((MBlog)localList1.get(i2)).uid;
List localList2 = HomeListActivity.this.mList;
int i3 = paramInt;
String str2 = ((MBlog)localList2.get(i3)).uid;
String str3 = str1;
if (!str2.equals(str3))
break label271;
int i4 = 1;
label156: if (paramView != null)
break label277;
HomeListActivity localHomeListActivity1 = HomeListActivity.this;
ListView localListView1 = HomeListActivity.this.mLvHome;
List localList3 = HomeListActivity.this.mList;
int i5 = paramInt;
MBlog localMBlog1 = (MBlog)localList3.get(i5);
HomeListActivity localHomeListActivity2 = HomeListActivity.this;
int i6 = paramInt;
boolean bool4 = localHomeListActivity2.isNewCommer(i6);
int i7 = HomeListActivity.this.mReadMode;
localObject2 = new MBlogListItemView(localHomeListActivity1, localListView1, localMBlog1, bool1, bool2, i4, bool4, i7);
}
while (true)
{
localObject1 = localObject2;
break label26:
str1 = StaticInfo.mUser.uid;
break label110:
label271: boolean bool3 = null;
break label156:
label277: localObject2 = paramView;
try
{
MainListItemView localMainListItemView = (MainListItemView)localObject2;
List localList4 = HomeListActivity.this.mList;
int i8 = paramInt;
Object localObject3 = localList4.get(i8);
HomeListActivity localHomeListActivity3 = HomeListActivity.this;
int i9 = paramInt;
boolean bool5 = localHomeListActivity3.isNewCommer(i9);
int i10 = HomeListActivity.this.mReadMode;
boolean bool6 = bool1;
boolean bool7 = bool2;
localMainListItemView.update(localObject3, bool6, bool7, bool5, i10);
}
catch (Exception localException)
{
HomeListActivity localHomeListActivity4 = HomeListActivity.this;
ListView localListView2 = HomeListActivity.this.mLvHome;
List localList5 = HomeListActivity.this.mList;
int i11 = paramInt;
MBlog localMBlog2 = (MBlog)localList5.get(i11);
HomeListActivity localHomeListActivity5 = HomeListActivity.this;
int i12 = paramInt;
boolean bool8 = localHomeListActivity5.isNewCommer(i12);
int i13 = HomeListActivity.this.mReadMode;
localObject2 = new MBlogListItemView(localHomeListActivity4, localListView2, localMBlog2, bool1, bool2, bool3, bool8, i13);
}
}
}

代码说明:

代码流程已经比较混乱,但是这里能看到并没有直接的inflate,而是自定义了继承自LinearLayout的MBlogListItemView。

MBlogListItemView
public MBlogListItemView(Context paramContext, ListView paramListView, MBlog paramMBlog, boolean paramBoolean1, boolean paramBoolean2, boolean paramBoolean3, boolean paramBoolean4, int paramInt)
{
super(paramContext);
this.context = paramContext;
this.parent = paramListView;
this.mBlog = paramMBlog;
String str1 = paramContext.getCacheDir().getAbsolutePath();
this.mCacheDir = str1;
String str2 = paramContext.getFilesDir().getAbsolutePath();
this.mFileDir = str2;
((LayoutInflater)paramContext.getSystemService("layout_inflater")).inflate(2130903061, this);
TextView localTextView1 = (TextView)findViewById(2131624016);
this.mName = localTextView1;
TextView localTextView2 = (TextView)findViewById(2131624041);
this.mDate = localTextView2;
TextView localTextView3 = (TextView)findViewById(2131624018);
this.mContent = localTextView3;
TextView localTextView4 = (TextView)findViewById(2131624046);
this.mSubContent = localTextView4;
ImageView localImageView1 = (ImageView)findViewById(2131624040);
this.mIconV = localImageView1;
ImageView localImageView2 = (ImageView)findViewById(2131624042);
this.mIconPic = localImageView2;
ImageView localImageView3 = (ImageView)findViewById(2131624044);
this.mUploadPic1 = localImageView3;
ImageView localImageView4 = (ImageView)findViewById(2131623979);
this.mUploadPic2 = localImageView4;
TextView localTextView5 = (TextView)findViewById(2131624047);
this.tvForm = localTextView5;
TextView localTextView6 = (TextView)findViewById(2131623989);
this.tvComment = localTextView6;
this.tvComment.setOnClickListener(this);
TextView localTextView7 = (TextView)findViewById(2131623988);
this.tvRedirect = localTextView7;
this.tvRedirect.setOnClickListener(this);
ImageView localImageView5 = (ImageView)findViewById(2131624049);
this.imComment = localImageView5;
this.imComment.setOnClickListener(this);
ImageView localImageView6 = (ImageView)findViewById(2131624048);
this.imRedirect = localImageView6;
this.imRedirect.setOnClickListener(this);
ImageView localImageView7 = (ImageView)findViewById(2131624043);
this.imGpsIcon = localImageView7;
ImageView localImageView8 = (ImageView)findViewById(2131624013);
this.mPortrait = localImageView8;
LinearLayout localLinearLayout = (LinearLayout)findViewById(2131624045);
this.mSubLayout = localLinearLayout;
this.mReadMode = paramInt;
MBlogListItemView localMBlogListItemView = this;
MBlog localMBlog = paramMBlog;
boolean bool1 = paramBoolean1;
boolean bool2 = paramBoolean2;
boolean bool3 = paramBoolean4;
int i = paramInt;
localMBlogListItemView.update(localMBlog, bool1, bool2, bool3, i);
this.mUploadPic1.setOnClickListener(this);
this.mUploadPic2.setOnClickListener(this);
}

    代码说明:

      a).  MBlogListItemView extends LinearLayout implements MainListItemView
      b).  inflate(2130903061,this)这个数字代表R.layout.itemview。
 二、测试方案(方案五)

    按照新浪微博类似的做法进行测试。

    2.1  测试代码

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 开始计时
long startTime = System.nanoTime();

TestItemLayout item;
if (convertView == null) {
item = new TestItemLayout(BaseAdapterActivity.this);
} else
item = (TestItemLayout) convertView;
item.icon1.setImageResource(R.drawable.icon);
item.text1.setText(mData[position]);
item.icon2.setImageResource(R.drawable.icon);
item.text2.setText(mData[position]);

// 停止计时
long endTime = System.nanoTime();
// 计算耗时
long val = (endTime – startTime) / 1000L;
Log.e(“Test”, “Position:” + position + “:” + val);
if (count < 100) { if (val < 2000L) { sum += val; count++; } } else mTV.setText(String.valueOf(sum / 100L) + ":" + nullcount);// 显示统计结果 return item; } [/java]   TestItemLayout [java] public class TestItemLayout extends LinearLayout { public TextView text1; public ImageView icon1; public TextView text2; public ImageView icon2; public TestItemLayout(Context context) { super(context); ((LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate( R.layout.list_item_icon_text, this); icon1 = (ImageView) findViewById(R.id.icon1); text1 = (TextView) findViewById(R.id.text1); icon2 = (ImageView) findViewById(R.id.icon2); text2 = (TextView) findViewById(R.id.text2); } } [/java] 2.2  测试结果

次数 4个子元素 10个子元素
第一次 347 460
第二次 310 477
第三次 324 508
第四次 339 492
第五次 341 465

三、总结

从测试结果来看与ViewHolder性能非常接近,不会出现tag图片变小的问题(关于图片变小的问题,有朋友说是TAG中的元素对大小和位置有记忆),也能有效的减少findViewById的执行次数,这里建议完全可以取代ViewHolder。

关于ListView内部Adapter的心得大家可以看一下上文的总结4.1。

四、考虑

关于静态内部类这里不是很理解,是否能应用方案五还有待验证。

结束

优化ListView不仅仅只有对convertView的优化,还有许多这样那样的技巧,欢迎大家交流与分享 🙂

[转载](Android小应用)电话监听器

mikel阅读(1164)

[转载](Android小应用)电话监听器 – And_He – 博客园.

这是一个Android练手小项目,通过一个BroadcastReceiver广播接 收者监听手机启动状态,实现开机启动。因为是电话监听器,所以我们不能让用户察觉,所以不能有软件界面,这是要点,不然也不叫监听器了,主要实现的功能有 对所有语音通话进行录制并上传到网上,好了,不废话了,下面一步一步地写……

首先,我们先来了解一下Service服务

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:
第一步:继承Service类
public class PhoneListenerService extends Service {...}
第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<service android:name="PhoneListenerService"></service>
这里推荐使用eclipse图形化的界面添加
如上图所示,可以添加Service、Permission、BroadcastReceiver等,感兴趣可以自己试一下。
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这 两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者 退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须 同时死”的特点。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用 startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务, 只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方 法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致 多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用 unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。
服务常用生命周期回调方法如下:

onCreate() //该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService() 或bindService()方法,服务也只被创建一次。 onDestroy()//该方法在服务被终止时调用。

与采用Context.startService()方法启动服务有关的生命周期方法
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
与采用Context.bindService()方法启动服务有关的生命周期方法
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
OK,了解了服务,现在开始来开发这个小应用了……
首先在eclipse中新建一个项目,我的命名为:phonelistener,直接截图
因为我们在创建项目的时候必须要填上一个Activity,我就先随便填一个Activity界面,因为这个电话监听器不能让用户察觉,所以不能有界面的,待会儿在功能清单文件中删除。
接下来,我们添加一个服务类:PhoneListenerService,当调用这个服务类的方法的时候,我们实现监听的所有内容
package com.studio.listener; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class PhoneListenerService extends Service { private String TAG = "PhoneListenerService";//这里设置一个Log标志,方便于调试 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } /** * 此处复写onCreate()方法,当这个服务被创建的时候就实现监听 */ @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); /* 取得电话服务 */ TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener listener = new PhoneStateListener() { private String number;//定义一个监听电话号码 private boolean isRecord;//定义一个当前是否正在复制的标志 private MediaRecorder recorder;//媒体复制类 @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */ number = null; if (recorder != null && isRecord) { Log.i(TAG, "录音完成");//设定一个录音完成的标志,方便调试 recorder.stop();//录音完成 recorder.reset(); recorder.release(); isRecord = false;//录音完成,改变状态标志 } break; case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */ // 录制声音,这是录音的核心代码 try { Log.i(TAG, "开始录音"); recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 定义声音来自于麦克风 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//我们定义存储格式为3gp recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//定我编码 SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");//此处定义一个format类,方便对录音文件进行命名 String fileName = this.number + "_" + format.format(new Date()); /* 定义录音文件的输出路径,这里我们先保存到sdcard */ recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/" + fileName + ".3gp"); recorder.prepare(); recorder.start(); // 开始刻录 isRecord = true; } catch (Exception e) { Log.e(TAG, e.toString()); } break; case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */ this.number = incomingNumber; break; default: break; } } }; // 监听电话的状态 telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); Log.i(TAG, "服务已经启动"); } }
服务类写好了,记得要在功能清单文件中注册它,千万不要忘了……
<service android:name="PhoneListenerService"></service>
服务写好了,然后再来写一个广播接收器,以便于接收手机开机时的状态,监听到手机启动了的时候就启动我们的服务……
package com.studio.listener; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent service = new Intent(context, PhoneListenerService.class);//定义一个意图 context.startService(service);//开启服务 } }
这里面很简单,当我们的广播接收者接收到某个状态时就启动我们刚才定义的Service
下面在功能清单中配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.studio.listener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <!-- 对外部存储设备的写入权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 对外部文件的写入和删除权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <!-- 音频刻录权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> <!-- 接收手机完全开启状态权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <!-- 读取电话状态权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name="PhoneListenerService"></service> <receiver android:name="BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> </application> </manifest>
此功能清单中我已经把<Activity…/>的内容去掉了,因为我们不需要界面。反此应用安装到模拟器,然后关掉模拟器重新启动,可以用DDMS里面的有一个功能向我们的模拟器打电话的
因为我这里现在没有启动模拟器,所以是灰色的。在Incoming number后面输入5554,然后点击下面的call就可以呼叫了,当然也可以另外再开一个模拟器对5554进行呼叫,这样比较麻烦。
如果此处出现我们当在服务里面添加的TAG的话就表示成功了,然后查看sdcard是否有我们想要的录音文件,有就Ok了……
接下来我们要实现把这样一个音频文件上传到网络上的指定位置,然后删除sdcard上的音频文件,比较接近“监听”了……

[转载]Android中文合集(5)(126+8篇)(chm格式)

mikel阅读(1319)

[转载]Android中文合集(5)(126+8篇)(chm格式) – 农民伯伯 – 博客园.

前言

Android中文翻译组是一个非盈利性质的开源组织,聚一批开发人员、大学生、研究生等Android爱好者,利用业余时间对Android相关的API及开发者指南等进行翻译,至今已超过200人报名参与,欢迎加入,联系Mailover140@gmail.com关于翻译组的更多介绍,请看这里

本合集包含126章节API8章开发者指南。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、截图

二、 章节

三、 名单

本合集参与章节翻译名单:移动云_文斌深夜未眠xiaoQLugansc23AtomicAmanAndroid Club SYSUcnmahjcoficeHalZhanghenly.zhangjiahuibinKunloveshirui madgoatpengyouhongTinawallace20100_1凌云健笔逝憶流緣天涯明月刀Haiya 胡蝶、桂仁、唐明、颖哥儿、思考的狼德罗德、首当其冲、CN七号、麦子獨鍆躌踄我是谁、一昕、六必治农民伯伯

四、共享

无论你是个人还是团队,不管是否加入我们,如果翻译Android官方相关文章,请与我们分享进度,把你翻译的章节发邮箱到over140@gmail.com ,以免重复翻译。我们的进度:这里(以“进度_”开头的Excel文件)。

五、招募自愿者

文档翻译员,要求:

1. 有耐心,这是一场持久战,需要大家的坚持。

2. 有态度,认真对待每一篇译稿。

3. 会英语,至少在翻译工具的帮助下能读懂英文原文。

[]审核员,要求:

1.  脾气好,审稿过程中需要和组员沟通,需要好脾气来沟通。

2.  技术好,工作经验2年以上,Android经验半年以上,对技术有自己的理解。

3.  英语好,英语6级以上,有相关翻译经验更佳。

4.  原则上每周能审稿至少1篇。

五、下载

chm格式

Android中文翻译组-中文合集5

pdf格式

Android中文合集.pdf

注意

如果打不开chm格式合集,请在chm文件上点击右键,选择属性,在弹出的对话框中,点击“解除锁定”,就可以了。

结束

虽然合集5与合集4相比增加的章节并不多,但是大家仍然是挤时间在支持,我们相信——坚持就是胜利!

[转载]Android基础类之BaseAdapter

mikel阅读(1026)

[转载]Android基础类之BaseAdapter – 宁 静 致 远 – 博客园.

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,
1、Adapter类简介
1)、Adapter相关类结构如下图所示:
Adapter
自定义Adapter子类,就需要实现上面几个方法,其中最重要的是getView()方法,它是将获取数据后的View组件返回,如ListView中每一行里的TextView、Gallery中的每个ImageView。
2)、Adapter在Android应用程序中起着非常重要的作用,应用也非常广泛,它可看作是数据源和UI组件之间的桥梁,其中Adapter、数据和UI之间的关系,可以用下图表示:
t2A9A
3)、常用子类
Adapter常用子类
2、BaseAdapter简介
BaseAdapter是实现了ListAdapter和SpinnerAdapter两个接口,当然它也可以直接给ListView和Spinner等UI组件直接提供数据。
相关类结构如下图所示:
tCCA2
3、示例
示例一:Gallery显示一组图片
运行结果:

说明:上面一行图片是Gallery画廊,每次点击一个Gallery图片时,会同时在下面以大图形式显示出来该图片
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Gallery android:id="@+id/gallery1" android:layout_width="match_parent" android:spacing="5px" android:layout_height="wrap_content" ></Gallery> <ImageView android:id="@+id/iv" android:layout_gravity="center_vertical" android:layout_marginTop="20px" android:layout_width="320px" android:layout_height="320px" ></ImageView> </LinearLayout>
MainActivity类:
package com.magc.adapter; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity { private Gallery gallery; private ImageView imgview; private int[] imgs = {R.drawable.a6,R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5}; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imgview = (ImageView)findViewById(R.id.iv); gallery = (Gallery)findViewById(R.id.gallery1); MyImgAdapter adapter = new MyImgAdapter(this); gallery.setAdapter(adapter); gallery.setOnItemClickListener(new OnItemClickListener() { //用户点击图片时,将该图片的ResourceID设到下面的ImageView中去, @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { imgview.setImageResource(imgs[position]); } }); } class MyImgAdapter extends BaseAdapter {      //自定义图片Adapter以内部类形式存在于MainActivity中,方便访问MainActivity中的各个变量,特别是imgs数组 private Context context;//用于接收传递过来的Context对象 public MyImgAdapter(Context context) { super(); this.context = context; } /* (non-Javadoc) * @see android.widget.Adapter#getCount() */ @Override public int getCount() { return imgs.length; } /* (non-Javadoc) * @see android.widget.Adapter#getItem(int) */ @Override public Object getItem(int position) { return position; } /* (non-Javadoc) * @see android.widget.Adapter#getItemId(int) */ @Override public long getItemId(int position) { return position; } /* (non-Javadoc) * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) */ @Override public View getView(int position, View convertView, ViewGroup parent) { //针对每一个数据(即每一个图片ID)创建一个ImageView实例, ImageView iv = new ImageView(context);//针对外面传递过来的Context变量, iv.setImageResource(imgs[position]); Log.i("magc", String.valueOf(imgs[position])); iv.setLayoutParams(new Gallery.LayoutParams(80, 80));//设置Gallery中每一个图片的大小为80*80。 iv.setScaleType(ImageView.ScaleType.FIT_XY); return iv; } } }
示例2:通过一个提示框来选择头像的功能(Gallery和ImageSwitcher结合显示图片)
待续……

[转载]android UI进阶之布局的优化

mikel阅读(903)

[转载]android UI进阶之布局的优化 – noTice520 – 博客园.

欢迎转载,但是请保留出处。http://www.cnblogs.com/noTice520/

好久没更新博客了,趁着清明来写点什么。

今天来讲下如何使用Android中提供的工具优化我们的布局。首先我们写一个最简单的框架布局。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="300dip"
android:layout_height="300dip"
android:background="#00008B"
android:layout_gravity="center"
/>
<TextView
android:layout_width="250dip"
android:layout_height="250dip"
android:background="#0000CD"
android:layout_gravity="center"
/>
<TextView
android:layout_width="200dip"
android:layout_height="200dip"
android:background="#0000FF"
android:layout_gravity="center"
/>
<TextView
android:layout_width="150dip"
android:layout_height="150dip"
android:background="#00BFFF"
android:layout_gravity="center"
/>
<TextView
android:layout_width="100dip"
android:layout_height="100dip"
android:background="#00CED1"
android:layout_gravity="center"
/>
</FrameLayout>


非常简单的一个布局,实现一个层叠的效果,运行效果如下图:

下面我们就用Android中提供的一个观察布局的工具,层级观察器,Hierarchy Viewer来观察我们的布局。Hierarchy Viewer工具是一个非常好的布局优化工具,同时,你也可以通过它学习他人的布局。应该说是一个非常实用的工具。

   Hierarchy Viewer在sdk的tools目录下,打开后最新界面如图所示:

  界面很简洁,列出了当前设备上的进程,在前台的进程加粗显示。上面有三个选项,分别是刷新进程列表,将层次结构载入到树形图,截取屏幕到一个拥有像素栅格的放大镜中。对应的在左下角可以进行三个视图的切换。在模拟器上打开写好的框架布局,在页面上选择,点击Load View,进入如图所示界面。

  左边的大图为应用布局的树形结构,上面写有控件名称和id等信息,下方的圆形表示这个节点的渲染速度,从左至右分别为测量大小,布局和绘制。绿色最快,红色最慢。右下角的数字为子节点在父节点中的索引,如果没有子节点则为0。点击可以查看对应控件预览图、该节点的子节点数(为6则有5个子节点)以及具体渲染时间。双击可以打开控件图。右侧是树形结构的预览、控件属性和应用界面的结构预览。点击相应的树形图中的控件可以在右侧看到他在布局中的位置和属性。工具栏有一系列的工具,保存为png或者psd,刷新等工具。其中有个load overlay选项可以加入新的图层。当你需要在你的布局中放上一个bitmap,你会用到它来帮你布局。点击左下角的第三个图标切换到像素视图,如下图所示。

  视图左侧为View和ViewGroup关系图,点击其中的View会在右边的图像中用红色线条为我们选中相应的View。最右侧为设备上的原图。中间为放大后带像素栅格的图像,可以在Zoom栏调整放大倍数。在这里能定位控件的坐标,颜色。观察布局就更加的方便了。

接下来再介绍下另一个布局优化工具-layoutopt。这是android为我们提供的布局分析工具。它能分析指定的布局,然后提出优化建议。  

  要运行它,打开命令行进入sdk的tools目录,输入layoutopt加上你的布局目录命令行。运行后如图所示,框出的部分即为该工具分析布局后提出的建议,这里为建议替换标签。

下面列出一些常会碰到的输出:

$ layoutopt samples/
samples/compound.xml
7:23 The root-level can be replaced with
11:21 This LinearLayout layout or its FrameLayout parent is useless
samples/simple.xml 提示未使用到该布局
7:7 The root-level can be replaced with
samples/too_deep.xml
-1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10! 20:81 This LinearLayout layout or its LinearLayout parent is useless 24:79 This LinearLayout layout or its LinearLayout parent is useless 28:77 This LinearLayout layout or its LinearLayout parent is useless 32:75 This LinearLayout layout or its LinearLayout parent is useless 36:73 This LinearLayout layout or its LinearLayout parent is useless 40:71 This LinearLayout layout or its LinearLayout parent is useless 44:69 This LinearLayout layout or its LinearLayout parent is useless 48:67 This LinearLayout layout or its LinearLayout parent is useless 52:65 This LinearLayout layout or its LinearLayout parent is useless 56:63 This LinearLayout layout or its LinearLayout parent is useless samples/too_many.xml 7:413 The root-level can be replaced with
-1:-1 This layout has too many views: 81 views, it should have <= 80! samples/useless.xml 提示该布局中有太多的控件 7:19 The root-level can be replaced with
11:17 This LinearLayout layout or its FrameLayout parent is useless

通过这个工具,能很好的优化我们的UI设计,布局方法。好了,今天就写到这里了。希望对大家有帮助,有问题可以留言交流~这里说下有的网站转载了我的文章,我很开心。但是都不留个出处,那就不太好了。所以欢迎转载,但是请保留出处。http://www.cnblogs.com/noTice520/

[转载]Android的RatingBar的自定义效果

mikel阅读(930)

[转载]RatingBar的自定义效果 – 没有代码 – 博客园.

首先看看效果:

有时候Android系统提供给我们的ratingbar效果并不达到我们的要求,这个时候就可以自定义自己喜欢的ratingbar。

从上面的效果可以看出,自定义这样的组件,需要两张图片: 。一张用来未选择的效果,一张用来显示的效果。那还要中间那种一半是未选择一半时选择的呢?其实当你写好这样的组件后,系统就会自动帮你自动解析生成那种效果。

整个项目布局:

我们一步一步来分析:

<RatingBar

style=“@style/roomRatingBar”

Android:layout_marginLeft=“10dip”

Android:layout_width=“wrap_content” android:layout_height=“wrap_content”

android:id=“@+id/room_ratingbar”></RatingBar>

从上面可看出自定义ratingbar主要是这段style=“@style/roomRatingBar” ,好我们去找到这段代码

/////////styles.xml

<?xml version=“1.0” encoding=“utf-8”?>

<resources>

<style name=“roomRatingBar” parent=“@android:style/Widget.RatingBar”>

<item name=“android:progressDrawable”>@drawable/room_rating_bar</item>

<item name=“android:minHeight”>16dip</item>

<item name=“android:maxHeight”>16dip</item>

</style>

</resources>

上面的意思是继承@android:style/Widget.RatingBar,重写android:progressDrawable属性,换成我们自定义@drawable/room_rating_bar文件。

控制该组件的最大和最小高度。好我们继续去找这自定义文件@drawable/room_rating_bar。

///// room_rating_bar.xml

<?xml version=“1.0” encoding=“utf-8”?>

<!–

This is the rating bar drawable that is used to show a room num.

–>

<layer-list xmlns:android=“http://schemas.android.com/apk/res/android”>

<item android:id=“@+android:id/background”

android:drawable=“@drawable/room_unselect”></item>

<item android:id=“@+android:id/secondaryProgress”

android:drawable=“@drawable/room_unselect”></item>

<item android:id=“@+android:id/progress”

android:drawable=“@drawable/room_select”></item>

</layer-list>

好了,越来越接近真相了。这里就是定义组件的背景图片、一级进度背景图片和二级进度背景图片(里面这些id都是系统的id,当系统运行到这里时会自动根据这个id去重画组件)

讲到这里大概明白怎么用了。其实很多组件都可以通过这样的方法来使用,但如果明白整个过程,那以后做起其他来都至少有一点得心应手的感觉吧。好!下来我也只能说说我的见解,因为本人对android的理解也不是很深入。

前提是下载android的源码,这里我就不讲了。在android framework\base\core\res\res\values(android framework是我保存源码的目录)目录下找到styles.xml文件,该文件是android系统运行时所要加载的文件,里面保存了所有组件的样 式定义。在里面你可以找到<style name=”Widget.RatingBar”>我们之前继承的其中一个组件样式,也有其他<style name=”Widget.RatingBar.Small”>、<style name=”Widget.SeekBar”>、<style name=”Widget.ProgressBar.Small”>等等。这样里面的属性我们继承后就可以被重写成其他的了。

项目:

http://files.cnblogs.com/not-code/testRatingBar.zip

[转载]Linux(centos)下Android环境的配置.

mikel阅读(1106)

[转载]Linux(centos)下Android环境的配置. – wilsonChan – 博客园.

Linux 下搭建Android环境 这几天在弄Linux,看到最近很火的Android,就尝试着在Linux上搭建一个Android的环境。

一直使用的是Centos就使用这个来作为开发的环境。

第一次配置大概弄了一整天,出现了很多的问题,同时也有解决问题的方法,可以作为参考,作为一个新手,如果有什么纰漏,还请各位大神指点。

-:安装JDK

没有使用Centos自带的JDK,选择重新安装,下载了最新版本的JAVA.

点击DownLoad选择Platform中的Linux,然后Continue。

选择需要的安装包,我选择的是“jdk-6u21-linux-i586-rpm.bin”

下载完成后添加权限

1 #chmod +x jdk-6u21-linux-i586-rpm.bin 2 然后执行 3 #./jdk-6u1-linux-i586-rpm.bin

如果过程中可能出现一些选择,直接yes

安装完成后查看当前系统jdk版本

1 #java -version

JDK安装完成后,进行IDE安装,我选用的是eclipse.

二.安装eclipse

这里使用的是Eclipse Classic 3.6.2.下载地址

同时在root文件夹中创建了Android文件夹,相关的IDE和sdk都保存在此。

Eclipse是绿色版,解压就可以用,解压完成,打开Eclipse设置workspace.

三.安装ADT(这一步很容易出问题)

我安装的是版本ADT-10.0.1.zip Android开发工具。
1. 启动 Eclipse, 然后进入 Help > Install New Software.
2. 在 Available Software 对话框里,点击 Add….
3. 出现 Add Site 对话框,在 Name 域里面输入一个名字 (如, “Android”) ,在 “Location” 域里面输入 https://dl-ssl.google.com/android/eclipse/
4. 注意:如果有问题,可以把 https 换成 http 试一下。点击 OK.
5. 回到 Available Software 界面,你应该看到 “Developer Tools” 。选取 checkbox 。点击 Next,  然后点击 Finish.进行安装。
6. 重起 Eclipse.

注意:

如果在下载这一步出问题的朋友,可以使用离线安装,下载ADT的文件,下载地址:http://dl.google.com/android/ADT-10.0.1.zip

解压到我们创建的Android工具文件夹中,然后用同样的方法定位。参看步骤3。

如果在安装插件的过程中,出现无法安装的问题,请安装 Google Plugin for Eclipse 3.6。

安装方法很简单,帮上面Location地址改成 http://dl.google.com/eclipse/plugin/3.6

详细安装方法请见.http://code.google.com/intl/zh-CN/eclipse/docs/install-eclipse-3.6.html

四.下载SDK.
for Linux版本. http://dl-ssl.google.com/android/repository/android-2.2_r01-linux.zip
需要知道的是这个 zip 包并不是一个完整的软件包。Android 软件包采用“组件”的形式,用户可以根据需要选取组件。

上述zip文件只包含了一个组件管理工具和一个基本的工具组件。

下载完成后解压到我们的Andoid文件夹中。

五.配置SDK.

1. 选取 Eclipse Window > Preferences…
2. 选择 Android
3. 点击 Browse… 定位 Android SDK 目录。例如我的目录:/home/Android/android-sdk-linux_86
4. 点击 Apply, 然后 OK.(会提示出错,肯定会出错..因为sdk的跟新还没有下载。)

六.跟新SDK

1.运行 Eclipse, 选取 Window > Android SDK and AVD Manager.
2.在左侧面板选择 Installed Packages
3.点击 Update All.
出现 Choose Packages to Install 对话,选择Accept All,点击Install
大概2GB的容量。想全部下载,睡个午觉或者干点别的什么吧(也可以选择自己需要的进行下载)。

下载完后.重启Eclipse,就可以信件Android Project.

注意:一般情况这个时候信件一个Project选择好模拟器就可以编译了..如果在编译中出现 找不到glibc2.7的错误

请看以下链接http://blog.sina.com.cn/s/blog_64a2c65a0100hl98.html 升级2.7.

最后编译成功.附上几张测试效果图

分类: else