android项目笔记整理(2)

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();

时间: 2024-10-08 21:59:03

android项目笔记整理(2)的相关文章

Android项目笔记整理(1)

1.Activity界面切换:   if(条件1){        setContentView(R.layout.main);   }else{        setContentView(R.layout.other); } 2.带有返回的Activity消息传递:MainActivity中核心代码如下:    Button.setOnClickListener(listener);          View.OnClickListener   listener=new OnClickLi

android项目笔记整理(3)

61.AlphabetIndexer字母索引辅助类       实现对链表类型的数据进行快速索引. 应用于类似联系人列表右侧的导航栏 注意: 1.链表里的元素必须是Object类型,并实现toString()方法. 2.链表元素的顺序需按照字母顺序排列(toString()的结果排序)构造函数:public AlphabetIndexer(Cursor cursor,int sortedColumnIndex,CharSequence alphabet)参数1:包含数据的Cursor对象参数2:

1、Android项目框架搭建 (分析需求、整理资料)

闲来无事.想搭个框架试试 分析一般应用 将资料整理整理 粗略统计 需要以下资料 1.android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal )ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也

Cocos2dx 学习笔记整理----第一个项目

接上一节, 进入新建的项目下面的proj.win32下面,找到项目名.sln文件(我的是game001.sln),双击会通过VS2010打开.(当然,你装了VS什么版本就是什么版本) 将你的项目设为启动项目, 切换到解决方案视图, 然后邮件点击解决方案, 选择生成解决方案. 第一次生成根据个人机器性能会消耗大概1-3分钟,呵呵. 但是以后会快很多的. 生成成功的话会在输出窗口显示如下: 一般都会生成成功,但是我生成的时候失败了很多次,后来发现是这个问题:http://www.cnblogs.co

Cocos2dx 学习笔记整理----在项目中使用图片(初)

cocos2dx有多种使用图片的方法,先来个最简单的:用CCSprite直接使用图片. 首先,进入到之前建立的项目,把你将要使用的图片放入到目录下的Resources文件夹里面.项目中以相对路径使用资源皆是以Resources文件夹为根目录参考的. 然后进入到HelloWorldScene.cpp的init方法的最后面加入以下代码: ? 1 2 3 CCSprite * sprite = CCSprite::create("bl_24.png"); sprite->setPosi

Cocos2dx 学习笔记整理----在项目中使用图片(二)

之前了解了一种比较简单的图片的使用方式, 今次来了解稍微复杂一点的图片使用方式,plist+png. 这里要用到之前提到的Texture Packer. Texture Packer是一款图片打包工具,Texture Packer可以将素材打包成我们项目需要的格式. Cocos2dx支持很多种格式, 我们可以将某一种类的或者有共性的图片打包到一个png,然后用plist管理,以节约加载和内存,且显卡支持的纹理尺寸的长宽为2的n次幂,Texture Packer会把纹理整合到次尺寸. 今次我们利用

Android 项目优化(七):阿里巴巴Android开发手册整理总结

本来之前觉得Android项目优化系列的文章基本整理完毕了,但是近期又看了一下阿里Android开发手册有了很多收货,想再整理一篇,下面就开工吧. 先在这里列一下之前整理的文章及链接: Android 项目优化(一):项目代码规范优化 Android 项目优化(二):启动页面优化 Android 项目优化(三):MultiDex 优化 Android 项目优化(四):内存优化 Android 项目优化(五):应用启动优化 Android 项目优化(六):项目开发时优化技巧总结 下面是<阿里巴巴A

Android笔记(七十三) Android权限问题整理 非常全面

Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~150

最近整理的Android学习笔记

今天记录一下这段时期学习android的笔记,这些笔记比较凌乱,但总归是有用的,以后什么时候有用,可以直接查询来使用. Android沉浸式状态栏 如果想要我们的应用打开以后和状态栏的颜色保持一致,或者是我们自己定义的颜色,可以这样来做: 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/