31.利用SharedPreferences存储时间
读取时间:
SharedPreferences sp=this.getSharedPreferences("actm",Context.MODE_PRIVATE);
String lastTimeStr=sp.getString("lt",null);
if(lastTimeStr==null){
lastTimeStr="您是第一次访问本应用程序.";
}else{
lastTimeStr="您上次访问的时间为:"+lastTimeStr;
}
存储时间:
SharedPreferences.Editor editor=sp.edit();
editor.putString("lt",new Date().toLocaleString());
editor.commit();
32.获取电话信息
TelephonyManager tm=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
获取电话号码:
tm.getLine1Number();
获取电信网络国别:
tm.getNetworkCountryIso();
获取电信公司代码:
tm.getNetworkOperator();
获取电信公司名称:
tm.getNetworkOperatorName();
获取手机SIM码:
tm.getSimSerialNumber();
手机通讯类型:
tm.getPhoneType()==TelephonyManager.PHONE_TYPE_GSM |TelephonyManager.PHONE_TYPE_CDMA
手机网络类型:
tm.getNetworkType()==TelephonyManager.NETWORK_TYPE_GPRS |TelephonyManager.NETWORK_TYPE_UMTS |TelephonyManager.NETWORK_TYPE_HSDPA
手机漫游:
tm.isNetworkRoaming();
ContentResolver cr=MainActivity.this.getContentResolver();
str=android.provider.Settings.System.getString(cr,android.provider.Settings.System.BLUETOOTH_ON);
if(str.equals("1")){
蓝牙已打开;
}
str=android.provider.Settings.System.getString(cr,android.provider.Settings.System.WIFI_ON);
if(str.equals("1")){
Wifi已打开;
}
33.3D绘图
MainActivity中需要设置myGLSurfaceView界面,
void onCreate(){
mGLSurfaceView=new MySurfaceView(this);
mGLSurfaceView.requestFocus();
mGLSurfaceView.setFocusableInTouchMode(true);
//setContentView(mGLSurfaceView);
}
void onResume(){
super.onResume();
mGLSurfaceView.onResume();
}
void onPause(){
super.onPause();
mGLSurfaceView.onPause();
}
MySurfaceView中需要设置渲染器
public MySurfaceView(Context context){
super(context);
mRenderer=new SceneRenderer();
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
public int initTexture(GL10 gl,int drawableId){
int [] textures=new int[1];
gl.glGenTextures(1,textures,0);
int currTextureId=textures[0];
//绑定纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D,currTextureId);
//设置纹理参数
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTRUE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);、
gl.glTexParameterf(GL10.GL_TEXTRUE_2D,GL10.GL_TEXTRUE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
InputStream is=this.getResources().openRawResource(drawableId);
Bitmap bitmap;
try{
bitmap=BitmapFactory.decodeStream(is);
}finally{
try{
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
//关联纹理对象与纹理图片
GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bitmap,0);
bitmap.recycle();
return currTextureId;
}
private class SceneRenderer implements GLSurfaceView.Renderer{
//创建实体对象,降低耦合程度
//Board tp=new Board();
public void onSurfaceCreated(GL10 gl,EGLConfig config){
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
gl.glClearColor(0,0,0,0);
gl.glEnable(GL10.GL_DEPTH_TEST);
//初始化纹理
textureId=initTexture(gl,R.drawable.img);
}
public void onSurfaceChanged(GL10 gl,int width,int height){
gl.glViewport(0,0,width,height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(left,right,bottom,top,near,far);
gl.glDisable(GL10.GL_CULL_FACE);
}
public void onDrawFrame(GL10 gl){
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//绘制图形 tp.drawself(gl);
/**
其中可能用到的方法
gl.glPushMatrix();
gl.glPopMatrix();
gl.glRotatef(angle,x,y,z);
gl.glTranslatef(x,y,z);
*/
}
}
实体类,以Board类为例:
public class Board{
private FloatBuffer mVertexBuffer;
private FloatBuffer mTextureBuffer;
public Board(){
vCount=6;
//设置点
float vertices[]=new float[]{
length,height,0,
length,-height,0,
length+width,height,0,
length+width,height,0,
length,-height,0,
length+width,-height,0
};
ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());
mVertexBuffer=vbb.asFloatBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);
//设置纹理点
float textures[]=new float[]{
0,0,
0,1,
1,0,
1,0,
0,1,
1,1
};
ByteBuffer cbb=ByteBuffer.allocateDirect(textures.length*4);
cbb.order(ByteOrder.nativeOrder());
mTextureBuffer=cbb.asFloatBuffer();
mTextureBuffer.put(textures);
mTextureBuffer.position(0);
}
public void drawSelf(GL10 gl,int texId){
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,mVertexBuffer);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,mTextureBuffer);
gl.glBindTexture(GL10.GL_TEXTURE_2D,texId);
gl.glDrawArrays(GL10.GL_TRIANGLES,0,vCount);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
//设置颜色
/**
int colors[]=new int[]{
one,one,one,0,0,0,one,0,0,0,one,0,
one,one,one,0,one,0,0,0,one,0,0,0
};
ByteBuffer cbb=ByteBuffer.allocateDirect(colors.length*4);
cbb.order(ByteOrder.nativeOrder());
mColorBuffer=cbb.asIntBuffer();
mColorBuffer.put(colors);
mColorBuffer.position(0);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glColorPointer(4,GL10.GL_FIXED,0,mColorBuffer);
*/
}
}
34.定义动画
MainActivity中:
Animation myAnimation=AnimationUtils.loadAnimation(this,R.animation.myanimi);
ImageView myImageView;//获得对象
myImageView.startAnimation(myAnimation);
其中myanimi.xml文件:
<set>
<alpha android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"/>
<scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="3000"/>
<translate android:fromXDelta="30"
android:toXDelta="0"
android:fromYDelta="50"
android:toYDelta="50"
android:duration="3000"/>
<rotate android:interpolator="@android:anim/accelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="+350"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"/>
</set>
35.播放音频
MediaPlayer mp=new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnCompletionListener(new OnCompletionListener(){
public void onCompletion(MediaPlayer mp){
当当前音频播放完成后的事件处理;
}
});
try{
mp.setDataSource(currentPlayPath);
mp.prepare();
}catch(Exception e){
e.printStackTrace();
}
mp.start();
//获得当前播放音频的位置
mp.getCurrentPosition()
//暂停播放
mp.pause();
mp.stop();
mp.release();
mp=null;
//将音频播放的指定的时间点
mp.seekTo(int position);
?36.2D绘图
MainActivity中
void onCreate(){
super.onCreate(...);
MySurfaceView mySurfaceView=new MySurfaceView(this);
this.setContentView(mySurfaceView);
}
在MySurfaceView类中需要扩展SurfaceView类,实现SurfaceHolder.Callback接口
public class MySurfaceView extends SurfaceView implements Callback{
MainActivity activity;
Paint paint;
public MySurfaceView(MainActivity context){
super(context);
this.activity=context;
this.getHolder().addCallback(this);
paint=new Paint();
paint.setAntiAlias(true);
Bitmap bm=BitmapFactory.decodeResource(activity.getResources(),R.drawable.bm);
}
private void repaint(){
SurfaceHolder holder=this.getHolder();
Canvas canvas=holder.lockCanvas();
try{
synchronized(holder){
draw(canvas);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas!=null){
holder.unlockCanvasAndPost(canvas);
}
}
}
public void draw(Canvas canvas){
绘制图像;
}
public void surfaceCreated(SurfaceHolder holder){
Canvas canvas=holder.lockCanvas();
try{
synchronized(holder){
draw(canvas);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas!=null){
holder.unlockCanvasAndPost(canvas);
}
}
}
public void surfaceChanged(....){};
public void surfaceDestroyed(.....){};
}
?
37.WebView装载HTML标签
WebView wv = (WebView)this.findViewById(R.id.webView);
wv.loadData("<html>"
+ "<body test=#003324>"
+ "<a href=\"http://www.baidu.com\">www.baidu.com</a>"
+ "</body>"
+ "</html>"
, "text/html", "gb2312");
?
38.从网上下载装载图片
String uriPic = editText.getText().toString().trim();
URL imageUrl = null;
Bitmap bitmap=null;
try{
imageUrl=new URL(uriPic);
}catch(MalformedURLException e){
e.printStackTrace();
}
try{
HttpURLConnection conn=(HttpURLConnection)imageUrl.openConnection();
conn.connect();
InputStream is=conn.getInputStream();
bitmap=BitmapFactory.decodeStream(is);
is.close();
}catch(IOException e){
e.printStackTrace();
}
?
39.RadioButton,选项显示在文本的右边
android:button="@null"
android:drawableRight="@android:drawable/btn_radio"
?40.避免ListView滑动时背景色为黑色或白色
android:scrollingCache="false"
列表直接的分割线
android:divider="@drawable/line"
去掉背景边框
android:background ="@null"
41.适配器中如果是要从数据库等表中返回结果Cursor
可以使用SimpleCursorAdapter适配器或该类的父类
42.WebView
Url在一个WebView中显示内容
WebView.setWebViewClient(new HelloWebViewClient());
class HelloWebViewClient extends WebViewClient{
public boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
}
当按返回键时实现回退的效果
boolean onKeyDown(int keyCode,KeyEvent event){
if((keyCode==KeyEvent.KEYCODE_BACK)&&myWebView.canGoBack()){
myWebView.goBack();
return true;
}
return super.onKeyDown(keyCode,event);
}
WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
myWebView.setWebChromeClient(new WebChromeClient(){
public void onProgressChanged(WebView view,int progress){
activity.setTitle("Loading...");
activity.setProgress(progress*100);
if(progress==100){
activity.setTitle("Loading OK");
}
}
});
引用assets文件中的资源文件
file:///android_assets/fileName
myWebView.addJavascriptInterface(this,"MainActivity");
在Activity中调用WebView所显示页面中的javascript方法
String url="javascript:MethodName(‘"+参数+"‘)";
myWebView.loadUrl(url);
在javascript中调用Activity中的方法
window.MainActivity.MethodeName();
?
?43.Notification自定义图标
notification=new Notification();
notification.icon=R.drawable.bar;
notification.tickerText="Android开发从零开始";
notification.when=System.currentTimeMillis();
notification.flags=Notification.FLAG_AUTO_CANCEL;
RemoteViews contentView=new RemoteViews(getPackageName(),R.layout.notification);
contentView.setImageViewResource(R.id.image,R.drawable.notification_image);
contentView.setTextViewText(R.id.text,"自定义显示界面");
notification.contentView=contentView;
intent=new Intent(MainActivity.this,StatusBarActivity.class);
contentIntent=PendingIntent.getActivity(MainActitiy.this,0,intent,0);
notification.contentIntent=contentIntent;
notificationManager.notify(STATUS_BAR_ID,notification);
?
44.CMD中查看端口的占用情况
netstat -ano
重启adb
reset adb
启动adb
adb start -service
关掉adb
adb kill -service
更改编译版本
project.properties文件下修改target=android-<level API>
?
?45.打包apk的过程
.java-->.class-->分类合并各个class文件的信息-->.dex文件-->整合xml资源文件信息-->打包成apk压缩包-->进行数字签名-->部署
?
46.apk安装的过程(卸载apk为删除相关文件)
1.拷贝xxx.apk到/data/app/xxx-1.apk
2.在/data/data目录下创建一个文件夹,文件夹名为当前应用程序的包名
?
47.database事务
SQLiteDatabase db=helper.getWritableDatase();
db.beginTransaction();
try{
db.execSQL("update person set account=account-1000 where name=?" , new Object[]{"zhangsan"});
db.execSQL("update person set account=account+1000 where name=?" , new Object[]{"wangwu"});
db.setTransactionSuccessful();
}finally{
db.endTransaction();
db.close();
}
?
48.Contanct.db
raw_contacts表:保存联系人的id contact_id 存放联系人的id
data表:保存联系人的数据 data1存放数据 mimetype_id存放数据类型 raw_contact_id保存数据属于哪一个联系人的
mimetypes表:保存数据的类型 1 email 5 phone 7 name
需求:查询所有的联系人信息:
(1).查询raw_contact表 把所有的联系人的id取出来
(2).根据id查询data表 把这个id对应的所有的数据取出去
(3).根据数据的类型 查询mimetypes表 获取数据的业务类型
?
49.ANR:application not response 应用无响应
anr 参数的原因:
主线程 需要做很多重要的事情,响应点击事件,更新UI,如果在主线程里面阻塞过久的时间,应用程序就会无响应。
为了避免应用程序出现anr,所以的耗时操作都应该放在子线程里面执行.
谁创建的view对象,谁才能修改view对象
内部实现 更新界面的时候做一个检查
更新完毕ui后,检查这个更新的操作是否在主线程的代码执行的。
如果是 没有任何问题
如果不是 立刻抛出一个运行是异常ViewRootImp1$CalledFromWrongThreadException:
?
50.多线程下载
1.本地创建一个大小跟服务器文件相同大小的 临时文件
2.计算分配几个线程去下载服务器上的资源,知道每个线程下载文件的位置
每个线程下载的位置计算方式:
开始位置:(线程id-1)*每一块大小
结束位置:(线程id*每一块大小)-1
3.开启多个线程,每个线程下载对应位置的文件
4.如果所有的线程都把自己的数据下载完毕了,服务器上的资源就被下载到本地了
请求服务器下载部分的文件,指定文件的位置
conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);
int code=conn.getResponseCode();
//从服务器请求全部资源返回200 ok,如果从服务器请求部分资源返回206 ok
?
51.Intent.Action常见的用途用法
(1).Intent.ACTION_MAIN
String: android.intent.action.MAIN
标识Activity为一个程序的开始。比较常用。
Input:nothing
Output:nothing
<activity android:name=".Main" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(2).Intent.Action_CALL
Stirng: android.intent.action.CALL
呼叫指定的电话号码。
Input:电话号码。数据格式为:tel:+phone number
Output:Nothing
Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:1320010001");
startActivity(intent);
(3).Intent.Action.DIAL
String: action.intent.action.DIAL
调用拨号面板
Intent intent=new Intent();
intent.setAction(Intent.ACTION_DIAL); //android.intent.action.DIAL
intent.setData(Uri.parse("tel:1320010001");
startActivity(intent);
Input:电话号码。数据格式为:tel:+phone number
Output:Nothing
说明:打开Android的拨号UI。如果没有设置数据,则打开一个空的UI,如果设置数据,action.DIAL则通过调用getData()获取电话号码。
但设置电话号码的数据格式为 tel:+phone number.
(4).Intent.Action.ALL_APPS
String: andriod.intent.action.ALL_APPS
列出所有的应用。
Input:Nothing.
Output:Nothing.
(5).Intent.ACTION_ANSWER
Stirng: android.intent.action.ANSWER
处理呼入的电话。
Input:Nothing.
Output:Nothing.
(6).Intent.ACTION_ATTACH_DATA
String: android.action.ATTCH_DATA
用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人
Input: Data
Output:nothing
(7).Intent.ACTION_BUG_REPORT
String: android.intent.action.BUG_REPORT
显示Dug报告。
Input:nothing
output:nothing
(8).Intent.Action_CALL_BUTTON
String: android.action.intent.CALL_BUTTON.
相当于用户按下“拨号”键。经测试显示的是“通话记录”
Input:nothing
Output:nothing
Intent intent = new Intent(Intent.ACTION_CALL_BUTTON);
startActivity(intent);
(9).Intent.ACTION_CHOOSER
String: android.intent.action.CHOOSER
显示一个activity选择器,允许用户在进程之前选择他们想要的,与之对应的是Intent.ACTION_GET_CONTENT.
(10).Intent.ACTION_GET_CONTENT
String: android.intent.action.GET_CONTENT
允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
Input: Type
Output:URI
int requestCode = 1001;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"
intent.setType("image/*"); // 查看类型,如果是其他类型,比如视频则替换成 video/*,或 */*
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
(11).Intent.ACTION_VIEW
String android.intent.action.VIEW
用于显示用户的数据。
比较通用,会根据用户的数据类型打开相应的Activity。
比如 tel:13400010001打开拨号程序,http://www.g.cn则会打开浏览器等。
Uri uri = Uri.parse("http://www.google.com"); //浏览器
Uri uri =Uri.parse("tel:1232333"); //拨号程序
Uri uri=Uri.parse("geo:39.899533,116.036476"); //打开地图定位
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
//播放视频
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/media.mp4");
intent.setDataAndType(uri, "video/*");
startActivity(intent);
//调用发送短信的程序
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "信息内容...");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
(12).Intent.ACTION_SENDTO
String: android.intent.action.SENDTO
说明:发送短信息
//发送短信息
Uri uri = Uri.parse("smsto:13200100001");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "信息内容...");
startActivity(it);
//发送彩信,设备会提示选择合适的程序发送
Uri uri = Uri.parse("content://media/external/images/media/23");
//设备中的资源(图像或其他资源)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "内容");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(it);
//Email
Intent intent=new Intent(Intent.ACTION_SEND);
String[] tos={"[email protected]"};
String[] ccs={"[email protected]"};
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "The email body text");
intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
intent.setType("message/rfc822");
startActivity(Intent.createChooser(intent, "Choose Email Client"));
(13).Intent.ACTION_GET_CONTENT
//选择图片 requestCode 返回的标识
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"
intent.setType(contentType); //查看类型 String IMAGE_UNSPECIFIED = "image/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
//添加音频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
//拍摄视频
int durationLimit = getVideoCaptureDurationLimit(); //SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sizeLimit);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
//视频
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
//录音
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContentType.AUDIO_AMR); //String AUDIO_AMR = "audio/amr";
intent.setClassName("com.android.soundrecorder" , "com.android.soundrecorder.SoundRecorder");
((Activity) context).startActivityForResult(intent, requestCode);
//拍照 REQUEST_CODE_TAKE_PICTURE 为返回的标识
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //"android.media.action.IMAGE_CAPTURE";
intent.putExtra(MediaStore.EXTRA_OUTPUT, Mms.ScrapSpace.CONTENT_URI); // output,Uri.parse("content://mms/scrapSpace");
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
?
52.防止软件输入面板自动显示
在AndroidManifest.xml文件的<activity>元素中添加下面的属性
<activity
android:label="@string/app_name"
android:name=".LayoutsActivity"
android:windowSoftInputMode="stateHidden"/>
为了防止EditText自动获得焦点,在<LinearLayout>元素中添加下面的两个属性
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"/>
?
53.修改PrograssBar的进度条颜色
在styles.xml文件下添加风格
<style name="ProgressBar_Mini" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:maxHeight">50dip</item>
<item name="android:minHeight">8dip</item>
<item name="android:indeterminateOnly">false</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
<item name="android:progressDrawable">@drawable/progressbar_mini</item>
</style>
自定义progressDrawable资源文件
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#F5F5F5"
android:startColor="#BEBEBE" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="0dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#165CBC"
android:startColor="#85B0E9" />
</shape>
</clip>
</item>
<!-- 修改进度条的颜色 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerY="0.75"
android:endColor="#165CBC"
android:startColor="#85B0E9" />
</shape>
</clip>
</item>
</layer-list>
?
54.控件的阴影效果
<?xmlversion="1.0" encoding="utf-8"?>
<layer-listxmlns:android="http://schemas.android.com/apk/res/android" >
<item >
<shape >
<corners android:radius="25dp"/>
<gradient
android:startColor="#999999"
android:endColor="#E4E4E4"
android:type="linear"
android:angle="90"/>
</shape>
</item>
<item android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp">
<shape >
<corners android:radius="25dp"/>
<gradient
android:startColor="#E9E9E9"
android:endColor="#FFFFFF"
android:type="linear"
android:angle="90"/>
</shape>
</item>
</layer-list>
?
55.代码中显示和隐藏键盘
InputMethodManager imm = (InputMethodManager)getSystemService(SendActivity.this.INPUT_METHOD_SERVICE);
//显示键盘
imm.showSoftInput(editText, 0);
//隐藏键盘
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
//判断键盘是否激活
imm.isActive();
?
56.GridView中点击一个子控件后该子控件改变背景色,其他子控件恢复原色
链接:http://blog.163.com/[email protected]/blog/static/101823724201314103631112/
//在adapter里面添加一个方法:
private int clickTemp =-1;
//标识选择的item
public void setSelection(int position){
clickTemp = postion;
}
在getView里面添加:
public View getView(int position,View convertView,ViewGroup parent){
.......
//点击改变选中listItem的背景色
if(clickTemp == position){
layout.setBackgroundResource(R.drawable.check_in_gdv_bg_s);
}else{
layout.setBackgroundColor(Color.TRANSPARENT);
}
}
在点击事件中:
OnItemClickListener mItemClickListener =new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
.........
myDapter.setSelection(position);
myDapter.notifyDataSetChanged();
}
}
?
57.自定义创建字型
custom =new TextView(this);
//字体MgOpenCosmeticaBold.ttf放置于assets/font路径下
typeface = Typeface.createFromAsset(getAssets(),"font/MgOpenCosmeticaBold.ttf");
custom.setTypeface(typeface);
custom.setText("Custom Font FYI");
custom.setTextSize(20.0f);
//设置字体颜色
custom.setTextColor(Color.CYAN);
linearLayout.addView(custom,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
?58.TypedValue.applyDimension()的作用
这个方法是转变为标准尺寸的一个函数,例如
int size=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,20,context.getResources().getDisplayMetrics());
这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp.
?
59.fragment唯一标识符
每个fragment需要定义一个唯一的标识符,如果activity被销毁又重新启动,系统能够恢复该fragment的状态。如果想重新恢复,需要满足下面有3中方式之一:
a.定义ID:在布局文件中,定义android:id属性
<fragment
android:id="@+id/list"
android:name="com.example.news.ArticleListFragment"
........../>
b.指明tag: android:tag指明或者一个fragment对象add()或者replace()时指定tag
<fragment
android:id="@+id/list"
android:tag="first"
............/>
或者在事务中指明该fragment的tag
manager.beginTransaction().replace(R.id.right,new RightFrag(),"right").commit();
c.ViewGroup ID
如果该fragment均没有id和tag,系统将使用container view 布局的id
?
60.为fragment注册监听,弹出返回栈
FragmentManager manager = getFragmentManager();
注册OnBackStackChangedListener监听器,可以用来监听该任务对应的返回栈信息,当该返回栈状态发生改变时,执行对应的onBackStackChanged()方法
manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener(){
public void onBackStackChanged(){
Toast.makeText(MainActivity.this,"返回栈状态发生改变",1).show();
}
});
弹出返回栈:
模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用
.beginTransaction().addToBackStack("right")添加了进返回栈
manager.popBackStack();