Andorid一些知识点
来源:互联网 发布:免费数据报告网站 编辑:程序博客网 时间:2024/05/16 15:37
1.在任何地方获得APP的context
新建MyApplication.java
package com.example.util;import android.app.Application;import android.content.Context;public class MyApplication extends Application{ private static Context context; @Override public void onCreate() { context = getApplicationContext(); } public static Context getContext(){ return context; }}
在AndroidManifest.xml指定初始化MyApplication
<application android:name="com.example.util.MyApplication" ... > </application>
用法:在任何一个地方
Toast.makeText(MyApplication.getContext(),”高端技巧获得Context”,Toast.LENGTH_LONG).show();
2.使用Intent传递对象
Serializable(序列化)和Parcelable
Parcelable的效率比Serializable要高一些
Serializable:
只要让实体类实现Serializable借口。
如:
package com.example.entity;import java.io.Serializable;/* * 实体类给ListView提供数据 */public class Fruit implements Serializable{ int imageId; String name; public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
A.java
...intent.putExtra("fruit_data",fruit);...
B.java
...Fruit fruit = (Fruit)getIntent().getSerializableExtra("fruit_data");...
Parcelable :
package com.example.learing;import android.os.Parcel;import android.os.Parcelable;public class Model implements Parcelable{ private int id; private String name; public Model(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int describeContents() { return 0; } // 序列化 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } // 反序列化 public static final Parcelable.Creator<Model> CREATOR = new Creator<Model>() { @Override public Model[] newArray(int size) { return new Model[size]; } @Override public Model createFromParcel(Parcel source) { return new Model(source); } }; private Model(Parcel in) { id = in.readInt(); name = in.readString(); }}
3.定制自己的日记工具
//详情《第一行代码》-464页
。。。
3.在代码添加View
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewGroup layout = (ViewGroup) this.findViewById(R.id.frame_layout);//获得layout TextView tv = new TextView(this);//创建一个TextView tv.setGravity(Gravity.CENTER);//设置TextView的布局(居中) tv.setText("123");//设置TextView的内容 layout.addView(tv);//把view添加到layout中 }}
4.使用onSaveInstanceState()保存瞬时数据
public class MainActivity extends Activity { EditText ed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed = (EditText) this.findViewById(R.id.ed); ed.setText("2");//起作用 //一次进来不会执行(旋转屏幕后才会执行),只有旋转屏幕后savedInstanceState就不会为null if(savedInstanceState != null){ ed.setText(savedInstanceState.getString("ed")); Log.v("TAG","savedInstanceState"); Log.v("tag", ed.getText().toString()); //输出的值是“text”,但是界面不发生改变 } } @Override protected void onStart() { super.onStart(); Log.v("onStart()", ed.getText().toString()); } @Override protected void onResume() { super.onResume(); Log.v("onResume()", ed.getText().toString()); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //保存数据 outState.putString("ed", "text"); }}
效果:
结果说明:当屏幕旋转后,屏幕显示的依然是“2”,而不是“text”。
原因是因为在onCreate()方法里ed的值确实变为了“text”。但由于android可以自动的保存瞬时数据,当屏幕发生旋转时ed的值为“2”,这时候系统已经保存“2”这个值,当执行onResume()方法时,ed的值被赋值为“2”。所以ed值得变化为 2→text→2
5.Android程序(eclipse上的程序代码)不能直接在移动设备(如小米平板)上运行的解决方法
下载豌豆荚,进行usb连接,之后会自动安装驱动并进行秘钥验证,选择允许后程序即可用在移动设备上运行。
6.判断设备能不能打电话
TelephonyManager t = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);int type = t.getPhoneType();//type = 0 :不能通话
之前这篇文章消失了,不知道怎么得又回来了~~~可喜可贺可喜可贺
—
7.计算地球是2个点的经纬度,计算它们之间的距离(米)
private static double EARTH_RADIUS = 6378137.0;//地球半径 //判断经纬度 private static double rad(double d) { return d * Math.PI / 180.0; } /// <summary> /// 获取距离 /// </summary> /// <param name="lat1"></param> /// <param name="lng1"></param> /// <param name="lat2"></param> /// <param name="lng2"></param> /// <returns>返回米</returns> public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.round(s * 10000) / 10000; return s; }
8.使用腾讯地图时出现 couldn’t find “libtencentloc.so”
原因是在项目的libs目录下有,armebai,armebai-v7,armbeai-v8等文件,这些文件是与cpu适配相关的。armebai是调试版本(兼容版本),armebai-v7是发行版本。部分手机出现这个问题是原因在armebai-v7目录下没有这个”libtencentloc.so”文件。
解决的方案:
1.删除其他的armebai文件,如armebai-v7,留下一个armebai(兼容)—— ps.这个我试过,确实是可以的,只是性能会差一点
2.往armebai-v7等文件上加上对应的”libtencentloc.so”文件,这些文件在DEMO里可以找到—— ps.这个没有试过
介绍armebai的网址:http://gybin.iteye.com/blog/2031565
9.拖动View ,并让其自动回到原点(初始位置)
(1)拖动View,实际上是调用View的layout()方法来重新设置View的位置。
(2)回到原点的动画效果,在自定义View添加Scroller变量,在构造函数初始化并重写computeScroll()方法.
自定义View
DrawView.java
package com.example.day0115;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.Scroller;public class DrawView extends View{ public Scroller mScroller; public DrawView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mScroller = new Scroller(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } //draw()执行时会调用 @Override public void computeScroll() { super.computeScroll(); //判断scroller是否执行完毕 if (mScroller.computeScrollOffset()) { ((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //通过重绘来不断调用computeScroll() invalidate(); } }}
MainActivity.java
private int lastX;private int lastY;...@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE : int offsetX = (int) (event.getX()) - lastX;//x偏差值 int offsetY = (int) (event.getY()) - lastY;//y偏差值 drawView.layout(drawView.getLeft()+offsetX, drawView.getTop()+offsetY, drawView.getRight()+offsetX, drawView.getBottom()+offsetY); //另一种方法: //((View) textview.getParent()).scrollBy(-offsetX, -offsetY);//为什么是负的?因为这里是画板在移动. //这里移动的是内容,要移动View就要让它的parent执行这个方法 lastX = (int) event.getX(); lastY = (int) event.getY(); break; //实现方块自动回到原点(动画) case MotionEvent.ACTION_UP : int x = ((View)drawView.getParent()).getScrollX(); int y = ((View)drawView.getParent()).getScrollY(); drawView.mScroller.startScroll(x, y, -x, -y,2000);//2000即为动画时间2秒,另外一个重载的方法没有这个参数即动画时间默认短 drawView.invalidate();//重绘,开始动画 break; } return super.onTouchEvent(event); } ...
效果
10.在app里打开另一个app
以微信为例子,实际上是要知道另一个app的包名,如果手机上有微信则打开,没有则下载!
try { PackageManager packageManager = getPackageManager(); Intent intent=new Intent(); intent = packageManager.getLaunchIntentForPackage("com.tencent.mm"); startActivity(intent); } catch (Exception e) { e.printStackTrace(); Intent viewIntent = new Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/")); startActivity(viewIntent); }
转载于:http://blog.csdn.net/lovexieyuan520/article/details/44301753
11.Layout_weight的使用技巧
0.只有一个控件,但该控件显示占父控件的一半。在LinearLayout里添加android:weightSum=”2”
1.LinearLayout的layout_weight属性,首先按控件声明的尺寸(如dp,warp_content)进行分配,然后将剩下的尺寸按weight进行分配
2.如果layout_width=”match_parent”,又有layout_weight属性,
这样的话控制的比例会是反过来。比如weight是1 :2 :2,实际上控件显示的是2 : 1 :1.因为控件实际宽度=声明宽度+父控件剩余宽度*比例,如果控件声明的宽度是match_parent,那么父控件剩余宽度是负的(剩余宽度=480 - 480*3)。
3.对于weight(比例较小),text内容又超过2行的并且是garvity=center的控件。
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <TextView android:layout_weight="1" android:layout_width="0dp" android:layout_height="48dp" android:text="@string/hello_world" android:gravity="center" android:background="#333" /> <TextView android:layout_weight="2" android:layout_width="0dp" android:gravity="center" android:layout_height="48dp" android:text="@string/hello_world" android:background="#FFFF00" /> <TextView android:layout_weight="3" android:layout_width="0dp" android:layout_height="48dp" android:gravity="center" android:text="@string/hello_world" android:background="#FFC1C1" /></LinearLayout>
效果
解决方案:
实际上会变成文字对齐,只有在控件的parent加上android:baselineAligned=”false”,这里既是LinearLayout才能解决这个对齐问题
12关于获得的View的长宽
TextView tv = (TextView) findViewById(R.id.tv);// int height = tv.getMeasuredHeight();---> 0 // int height = tv.getHeight();---> 0 int height = tv.getLayoutParams().height; //----> 40
1.只有最后一种方式才能获取到height,其他2种方式获得的都是0.
2.padding不算在height里面
13.关于HashMap
HashMap<String, String> map = new HashMap<String,String>(); map.put("s", "s"); HashMap<String, String> v = map; v.put("s", "v"); Log.v("TAG", map.get("s"));
map里面的key为“s”的值已经被修改变为“v”。
而int 或者 String
String a = 0 +""; String b = a; b = 3+""; Log.v("TAG", a+"");
a的值依然为 “0”
14.简单动画(自定义View)
使用AnimationDrawable对象
public class AnimationView extends ImageView{ public AnimationView(Context context) { this(context, null); } public AnimationView(Context context, AttributeSet attrs) { super(context, attrs); initAnimation(context); } private void initAnimation(Context context) { /*定义AnimationDrawable动画*/ final AnimationDrawable ad = new AnimationDrawable(); for (int i = 0; i < 5; i++) { // 图片id 这里的图片是项目内的名称 int id = getResources().getIdentifier("login_animation"+i, "drawable", context.getPackageName()); // 根据图片id获得drawable对象 Drawable d = getResources().getDrawable(id); // 为动画添加drawable对象并设置切换间隔时间 ad.addFrame(d, 200); } // 设置动画循环 ad.setOneShot(false); // 为View设置背景 this.setBackgroundDrawable(ad); Runnable callback = new Runnable() { @Override public void run() { // 动画开始 ad.start(); } }; // 使用消息通知框架来开始播放动画,设置回调和延迟时间 new Handler( ).postDelayed(callback, 100); }}
15.activity和application的context有何区别?
Application Context只针对整个应用,而Activity 中的Context针对不同的Activity,也就是说,Application Context是户口本影响全局,Activity 中的Context是户口本中每个人的身份证影响单个人。
16.therad和service有何区别?
Service和Thread根本就不是一个级别的东西,Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类,由当前程序托管,而service托管于系统的servicemanager。这样做的目的是因为Thread独立于activity,一旦activity结束,该线程也不一定会执行完成,而此时你不再持有该thread的引用,你无法在控制他了。而且我们有的时候也需要多个不同的activity控制一个服务。这些thread都不能实现,所以我们引进service。
- Andorid一些知识点
- andorid知识点集合
- andorid知识点集合
- andorid知识点集合
- 一些知识点
- 一些知识点
- 一些知识点
- 一些知识点
- 一些知识点
- Andorid中一些重要的代码片段
- 一些有用的网址for andorid
- Andorid中mk文件的一些解释
- Andorid 3.0 更新的一些折腾
- Hibernate的一些知识点
- c#的一些知识点
- asp.net 一些知识点
- 一些小知识点
- c#中一些知识点
- 在ZedBoard上运行Linaro Ubuntu并挂载U盘
- 【11/30】 iOS开发成长之路,【NSTextField样式,UIbutton 内容居左】
- CSS 自动换行 word-break:break-all和word-wrap:break-word
- poj_2533:Longest Ordered Subsequence
- phpstorm快捷键
- Andorid一些知识点
- wustoj 习题总结
- 大神的指导
- JDBC的autoCommit为true时,其事务管理测试
- Android 图片缓存处理
- android studio 编译运行报错
- 模式学习之netcdf,netcdf-fortran,pgi安装
- wustoj 1056 C语言程序设计教程(第三版)课后习题10.5
- Java学习笔记(多线程_2)