精华内容
参与话题
问答
  • 安卓知识点

    2019-07-13 21:54:37
    安卓课程内容复习 1. 安卓编程的四大组件是哪些? Activity:显示用户界面并可以响应用户操作的程序(显示界面) Service:一种没有界面、在后台运行的程序(后台运行) Content Provider:提供给其他应用...

    安卓课程内容复习


    1. 安卓编程的四大组件是哪些?
    • Activity:显示用户界面并可以响应用户操作的程序(显示界面
    • Service:一种没有界面、在后台运行的程序(后台运行
    • Content Provider:提供给其他应用程序访问数据库的一种方法(数据通信
    • Broadcast Receiver:一种Intent广播的侦听器。如果应用程序侦听到与预设的过滤标准匹配的Intent广播,就会立即进行响应(广播通知

    01ppt 第7页

    2. dp、sp和px有什么异同点?
    • dp:与设备无关的像素(device independent pixels),随着密度变化,对应的像素数量也会变化。
    • sp:与缩放无关的像素(scaled -independent pixels),受用户字体大小影响,常用于设置字体大小,当文字尺寸是“正常”时1sp=1dp。
    • px:对应屏幕上的实际像素点(Pixels)。

    01ppt 第16页

    3. layout_width有哪些取值?
    • wrap_content:填充内容
    • match_parent:匹配父布局
    • 具体像素值

    01ppt 第20页

    4. padding和layout_margin的作用是什么?
    • padding:内容与控件边界之间保留的空白
    • margin:边界之外的空白

    01ppt 第19页

    5. layout_weight的作用是什么?有哪些取值?
    • layout_weight:根据父控件的余留空白按比例进行分配。
    • layout_weight的取值可以是大于或等于0的数。

    01ppt 第23页

    6. gravity的作用是什么?有哪些取值?

    gravity用于控件内容的对齐。
    gravity的取值包括top, bottom, left, right, center, center_vertical, center_horizontal, fill, fill_vertical, fill_horizontal, clip_vertical, clip_horizontal(fill增大控件,直到把内容填满控件;clip剪切掉超出部分),默认值取top|left

    01ppt 第28页

    7. tileMode的作用是什么?

    tileMode用于设置bitmap的平铺模式。tileMode有以下取值:

    • repeat:重复铺满整个背景。
    • mirror:重复铺满整个背景,且相邻两排成镜像对称。
    • clamp:尺寸大小设置成该bitmap。
    • disable:禁用平铺模式,效果等同于直接将图片设置成背景。

    01ppt 第33页,取值参考:https://www.jianshu.com/p/d41cac1c95d2

    8. android:textSize="10sp"是什么意思?

    表示将文字大小设置为10sp。
    此外,也可以动态调用控件的方法setTextSize()来设置文字大小,默认单位是px,如果需要设置单位为sp则是setTextSize(TypedValue.COMPLEX_UNIT_SP, 10)。

    01ppt 第24页

    9. CheckedTextView只是TextView和CheckBox的组合吗?它的作用是什么?

    CheckedTextView不只是TextView和CheckBox的组合。RadioButton和CheckBox都是选项框在前,文字在后;而CheckedTextView是文字在前,选项框在后。根据其checkMark属性的不同取值可以实现不同的选项框样式:

    • “?android:attr/listChoiceIndicatorSingle”:选项框为单选样式;
    • “?android:attr/listChoiceIndicatorMultiple”:选项框为多选样式;
    • 如果取值为自定义的selector布局,可实现自定义的选项框样式

    01ppt 第42页,取值参考:https://blog.csdn.net/Hai_pp/article/details/79234092

    10. 阅读下面代码:
    Button btn = (Button)findViewById(R.id.button);
    btn.setOnClickListener(new Button.OnClickListener(){
    	@Override
    	public void onClick(View vw){}
    });
    其中,new Button.OnClickListener(){}的作用是什么?@Override可以不加,加上@Override与不加的区别?

    new Button.OnClickListener(){}的作用是创建一个按键点击监听器的匿名对象,以响应按键点击事件。
    加上@Override与不加的区别在于:

    • 在加@Override的情况下,说明子类要覆盖基类的方法,基类必须存在与子类方法完成一致的方法,否则会报错(找不到被Override的方法)。
    • 在不加@Override注解的情况下,当基类存在与子类方法完全一致的方法则实现覆盖;否则是视为一个新的方法来使用。

    参考博客:https://blog.csdn.net/happydecai/article/details/80194795

    11. 阅读下面这段程序:
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, cities);
    lv = (ListView)findViewById(R.id.listView);
    lv.setAdapter(adapter);
    说明每条语句的作用。
    1. 创建ArrayAdapter对象,数据项cities与显示项android.R.layout.simple_list_item_multiple_choice是一一映射的关系。
    2. 获取ListView对象。
    3. 调用ListView对象的setAdapter方法绑定Adapter进行显示。

    02ppt 第5页

    12. 阅读下面程序:
    LinearLayout ll = (LinearLayout)findViewById(R.id.activity_main);
    for(int i = 0; i < 16; i++) {
    	TextView myTextView = new TextView(MainActivity.this);
    	myTextView.setText("第"+i+"行, Hello World!"); 
    	myTextView.setTextSize(30); 
    	myTextView.setBackgroundColor(Color.argb(255,200,200,255));
    	LinearLayout.LayoutParams textViewLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    	textViewLP.setMargins(0,20,0,0);
    	ll.addView(myTextView, textViewLP);
    }
    说明其功能。

    动态创建16个TextView控件,设置文字为"第i行, Hello World!"(0≤i<16)、字体大小为20px、背景颜色为argb(255,200,200,255),然后设置好控件的尺寸为填充内容、上边距为20px后,再把新控件依次放入到线性布局中。

    02ppt 第42页

    13. 以下相对布局中的Button是怎么布局的?
    <Button
    	android:text="Button2"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:id="@+id/button2"
    	android:layout_below="@+id/view01"
    	android:layout_toRightOf="@+id/view04"
    	android:layout_marginLeft="23dp"
    	android:layout_marginTop="58dp" />

    Button的布局位于view01控件的下方,距离view01下边界58dp处;同时位于view04控件右方,距离view04右边界23dp处。

    02ppt 第48页

    14. 线性布局和帧布局有什么差别?
    • 线性布局中所有控件是根据布局空间垂直或水平排列的,彼此间不会重叠。
    • 帧布局中所有控件是叠放在一起的,越往后面越在上层。

    02ppt 第45页

    15. 表布局和网格布局有什么差别?
    • 表布局是多行布局,每行可以放入若干控件作为列,并可以统一设置每列属性。
    • 网格布局是多行多列布局,一个控件可以占据一行一列,也可以跨越多列或多行。

    02ppt 第45页

    16. 以下程序的作用是什么?
    LinearLayout ll = new LinearLayout(MainActivity.this);
    ll.setOrientation(LinearLayout.VERTICAL);
    LinearLayout.LayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    addContentView(ll, lp);

    动态创建当前MainActivity的线性布局并设置参数,其中尺寸匹配父布局,屏幕方向为竖屏显示,将该线性布局放进当前的布局中。

    02ppt 第60页

    17. 以下程序的作用是什么?
    LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.line_item, null);
    TextView num = (TextView)ll.findViewById(R.id.num);
    num.setText(((EditText)findViewById(R.id.num)).getText());
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    ll.setPadding(20, 20, 10, 10);
    Layout layout=(Layout)findViewById(android.R.id.content); 
    layout.addView(ll,lp);

    先使用布局填充器将布局line_item转换为视图,由于parent为null所以不会将inflate得到的视图自动加入到parent。然后从视图中获取TextView控件并设置文字和尺寸,其中控件宽度匹配父布局,高度填充内容,内边距按左上右下的顺序分别设置为20dp、20dp、10dp和10dp,最后将该视图加入到布局layout中。

    02ppt 第61-62页

    18. 以下语句实现了哪条SQL语句的执行?
    SQLiteDatabase db = this.openOrCreateDatabase("dbStu.db3", MODE_PRIVATE, null);
    ContentValues cv = new ContentValues();
    cv.put("num", 1600123); 
    cv.put("name", "David");
    db.insert("stu", null, cv);

    答:

    INSERT INTO stu(num, name) values (1600123, 'David')

    03ppt 第6页

    19. 表stu的字段有stuNum(学号)、stuName(姓名)和classNum(班级号),字段类型为varchar(64)。
    如果要从表stu查询出班级号以“16”开头和班级中姓“张”的人数多于10的班级号classNum,并按人数升序,只从第10个班级开始取5个,请给出query方法:
    public Cursor query(String table,String[] columns, String selection,String[] selectionArgs, String groupBy,String having, String OrderBy,String limit);

    答:

    String table="stu";
    String[] columns=new String[]{"classNum"};
    String selection="classNum like '?%'  and stuName like '?%'";
    String[] selectionArgs=new String[]{"16", "张"};
    String groupBy="classNum";
    String having="COUNT(stuNum)>10";
    String orderBy="COUNT(stuNum)";
    Cursor c=db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, "9,5");

    20. 说明ContentProvider、ContentResolver和ContentObserver的用途。它们一定要在清单文件中定义吗?它们是如何关联上的?

    ContentProvider作为安卓四大控件之一,一定要在清单文件中定义,其余的则不需要。
    ContentProvider提供接口让其他app可以操作自己的数据并发出改变的消息。其他app则通过ContentResolver来操作这些数据。
    ContentObserver可以用来监听ContentProvider数据的改变消息。它们之间都是通过Uri进行联系的。

    03ppt 第34页

    21. 如何在Activity中取得ContentResolver?

    在Activity中可以通过调用getContentResolver方法来取得ContentResolver。

    03ppt 第42页

    22. ContentProvider要如何修改才能让ContentObserver起作用?

    在ContentProvider中要调用ContentResolver的notifyChange方法发送改变的通知。

    03ppt 第46&41页

    23. ContentProvider有的方法,ContentResolver是否一定有类似的方法?例如,ContentProvider有public Uri insert(Uri uri, ContentValues values),在ContentResolver中有吗?

    ContentProvider有的方法,ContentResolver不一定会有类似的方法,e.g.ContentProvider的getType方法。


    24. 执行完以下两条语句后wordid的值是什么?
    Uri uri = Uri.parse("content://com.ourexample.sqlite/person/12/5");
    long wordid = ContentUris.parseId(uri);

    运行后wordid的值为5。

    03ppt 第39页

    25. 安卓的事件绑定有哪四种方法?以下方法是否正确?
    • 把事件处理器直接在布局文件中绑定android:onClick=“clickHandler1”
    • 把接口OnClickListener的子类MyClickListener的一个实例设置为事件监听器。
    btn.setOnClickListener(new MyClickListener());
    class MyClickListener implements OnClickListener {
    	@Override
    	public void onClick(View v){ ... }
    }
    • 与上面不同的是试了用匿名子类的一个实例。
    btn.setOnClickListener(new OnClickListener(){
    	@Override
    	public void onClick(View v){ ... }
    });
    • 把Activity的实例作为接口OnClickListener的子类的实例。
    public class
    MainActivity extends AppCompatActivity implements OnClickListener {
    	@Override
    	public void onClick(View v){ ... }
    	protected void onCreate(){ 
    		btn.setOnClickListener(this);
    	}
    }

    04ppt 第4页

    26. 在一个Activitiy中启动另一个Activty的方法有哪些?系统如何找到被启动的Activity?
    • 用Activity启动第二个Activity:
    Intent intent = new Intent(this, SecondActivity.class);
    • Action启动第二个Activity或另一个app的Activity:
    intent.setAction("com.example.startact.SECONDACT");
    或
    Intent intent = new Intent("com.example.startact.SECONDACT");

    在名单文件有:

    <activity android:name=".SecondActivity">
    	<intent-filter>
    		<action android:name="com.example.startact.SECONDACT" />
    		<category android:name="android.intent.category.DEFAULT" />
    	</intent-filter>
    </activity>
    • 使用包名类名启动另一个app的Activity:
    intent.setClassName("com.example.startact", "com.example.startact.SecondActivity");

    04 ppt 第10-11页

    27. Intent的属性ComponentName是做什么用的?以下三条语句可以简化哪条语句?它的作用是什么?
    ComponentName comp = new ComponentName(CurActitivy.this, Activity2.class);
    Intent intent  = new Intent();
    Intent.setComponent(comp);

    ComponentName 属性是用来设置要访问的组件(Activity等)的包名类名,用于访问相同或不同的应用程序的组件
    上述三行可以简化成:

    Intent intent = new intent(CurActitivy.this, Activity2.class);

    作用是设置intent绑定的目标class。

    04 ppt 第36页

    28. Intent的action属性有什么作用?以下两条语句可以简化为哪一条语句?
    Intent intent  = new Intent();
    Intent.setAction("com.group.action.ADDRBK_ACTION");

    Intent的action属性指出要做什么动作。(这个动作只是给出一个字符串,由系统通过查找所有组件(Activity等)的intent-filter去查找匹配的组件)。
    可以简化为:

    Intent intent = new Intent("com.group.action.ADDRBK_ACTION");

    04ppt 第38页

    29. Intent的category属性有什么作用?

    category属性用于指明动作的附加信息(动作由action指定)。

    04ppt 第39页

    30. Intent的data和type用于在Activity之间传递什么内容?

    data属性用于提供一个Uri对象。 type属性用于指定data属性所指定的Uri对应的MIME类型,也可以自己定义,格式是abc/xyz。

    04ppt 第41页

    31. Intent的extra属性是什么类型?以下四条语句的最后两句可以简化为哪一条语句?
    Intent intent = new Intent();
    Bundle bundle = new Bundle();
    bundle.putString("user","Wang");
    intent.putExtras(bundle);

    答:extra属性是Bundle类的实例。最后两句可以简化为:

    Intent.putExtras("user","Wang");

    04ppt 第43页

    32. Activity的android:launchMode有哪四种?每种的作用是什么?

    • standard模式(默认):安卓会为目标Activity创建一个新实例,并把它加入当前Task栈中。
    • singleTop模式:与standard模式相同只是如果目标Activity已经位于Task的栈顶,则直接使用它,而不会创建一个新实例。
    • singleTask模式:一个Acitivity在同一个Task最多只有一个实例。当目标Activity被启动时,如果task中不存在该Activity的实例,则创建它的一个实例;如果已经在Task中,则弹出它之上的所有Activity,直到它处于栈顶;如果已经在栈顶,则与singleTop相同,直接使用它。
    • singleInstance模式: 如果将要启动的Activity不存在,系统将会先创建一个全新的Task,再创建目标Activity实例并将其放入此Task中且单独使用。如果将要启动的Activity已存在,那么无论它位于哪个应用程序系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。整个系统只会包含该Activity的一个实例且用一个Task单独保存。

    04ppt 第51-52页

    33. 如果A1和A2是两个Activity,它们的启动模式分别为standard和singleTop,A1调用A2用A1->A2表示,那么A1->A2->A1->A2->A2->A1->A1,Task栈从栈底到栈顶的Activity分别是什么?

    栈底到栈顶: A1->A2->A1->A2->A1->A1

    04ppt 第51-52页

    34. 一个处于stop状态的Activity是否可见?它在内存中吗?

    处于stop状态的Activity完全不可见,但仍停留在内存,保留了状态信息。

    04ppt 第60页

    35. AlertDialog主要有哪几种?
    • 简单对话框
    • 简单列表对话框
    • 单项选择对话框
    • 多项选择对话框

    05ppt 第5页

    36. Service和Activity有什么差别?BindService与一般的Service有什么差别?IntentService与一般的Service有什么差别?

    Service与Activity类似,只是没有界面。使用Servcie要先定义一个Service子类,并在AndroidManifest.xml中配置它。 Service和Activity一样,都是从Context派生出来的。因此都可以使用getResources()和getContentResolver()。
    使用BindService时,访问者与Service绑定在一起,访问者退出后,service也终止了。而使用一般的Service时访问者与Service之间没有关联,即使访问者退出了,Service也依然运行。
    使用IntentService启动会把Service放在子线程中执行

    07ppt 第3页

    37. 安卓采用什么机制实现线程之间的消息传递?子线程发送message给主线程的作用是什么?

    安卓使用消息循环消息队列实现线程之间的消息传递。子线程通过发送消息给主线程,让主线程更新UI。

    07ppt 第23页

    38、broadcast组件的作用是什么?普通广播与有序广播的差别在哪里?

    BroadcastReceiver的主要作用是接收系统或者自定义的广播,并进行相关的处理工作。
    普通广播是所有匹配的接收者均可同时收到广播消息,而有序广播让广播消息根据接收者的优先权依次经过每个接收者,每个接收者都可以停止继续传播消息。
    高优先级的Receiver通过setResultExtras方法来发送数据,低优先级的Receiver通过getResultExtras来获取Bundle数据包,进而获取数据,他们都可以用intent的Bundle来获取最初的广播发送者发出的消息。

    07ppt 第41页

    39. 电量变化时采用了什么组件发通知?该组件还可以发出什么通知?

    电量变化使用了系统广播来发通知。该组件还能发出:系统启动完成、网络状态变化、监听SD卡状态、监听应用安装变化等通知。

    07ppt 第50-54页

    40. 通信录和来电记录采用了什么组件进行编码?

    使用了ContentResolver组件来进行编码。

    03ppt 第34页

    41. 说明画布(Canvas)、画笔(Paint)和位图(Bitmap)的关系?

    每个视图(View)对象默认都有一个画布(Canvas)对象,并且关联一个位图(Bitmap)对象。利用画布对象可以在其关联的位图对象上用画笔(Paint)作画。

    08ppt 第3页

    42. 绘制形状和绘制位图有什么差别?

    绘制形状是通过定义View或控件的canvas对象来调用方法绘制,而绘制位图是通过获取Bitmap对象后在Bitmap对象上进行贴图等操作。

    08ppt 第16,37页

    43. 如何使用一个3X3的矩阵在绘制图像时进行Matrix变换?

    通过与原图坐标做矩阵乘法来进行Matrix变换。e.g.
    方法public void setTranslate(float dx, float dy);对应的变换公式为:
    在这里插入图片描述
    08ppt 第43页

    44. Camera变换的特点是什么?

    通过camera类可以产生用于3D变换的Matrix

    08ppt 第51页

    45. Canvas变换的作用是什么?

    Canvas可以进行平移(translate)、旋转(rotate)、缩放(scale)和错切(skew)变换。这些变换会引起整个坐标系的改变,使得之后对Canvas的绘图操作都是在变换后的坐标系进行。

    08ppt 第58页

    46. ColorMatrixColorFilter和LightingColorFilter在过滤图像颜色时有何区别?
    • ColorMatrixColorFilter 的构造器采用一个4x5的矩阵作为参数。
    • LightingColorFilter 的构造器采用一个3或4字节的乘数mul和一个3或4个字节的加数add (3个字节只包含RGB)

    08ppt 第78&80页

    47. PorterDuff的用途是什么?根据下图说明DST_ATOP和DST_IN的效果?

    在这里插入图片描述
    PorterDuff是用于图形混合的方法。(先绘制的图是目标图DST,后绘制的图是源图SRC,有18种混合模式)

    • DST_ATOP: 相交处绘制目标图,不相交处绘制源图
    • DST_IN: 在相交处绘制目标图.

    08ppt 第84-85页

    48. SurfaceView的用途是什么?它与TextureView的区别是什么?

    SurfaceView的目的是另外提供一个线程进行绘制操作。
    SurfaceView 是View的子类。它使用了双缓冲机制,在新的线程中利用一个缓冲区绘制好屏幕,然后提交到UI界面显示它。(不影响主线程的更新速度)
    TextureView可以看成和Button、 TextView一样的普通控件,可以使用平移、缩放、旋转等变换,也可以使用View.setAlpha()等操作。SurfaceView只能在整个屏幕中而不能作为一个View进行绘制。

    09ppt 第3页

    49. SurfaceView程序中的语句“holder.unlockCanvasAndPost(canvas);”的作用是什么?

    作用是:结束锁定并提交改变。

    09ppt 第7页

    50、补间动画、逐帧动画和属性动画分别有什么特点?
    • 补间动画(Tween Animation): 在给出控件的起止位置、大小、透明度和旋转角度后通过添加中间值的变化过程而产生动画效果。也称为视图动画(View Animation)。
    • 逐帧动画(Frame Animation):通过用多幅图片替换显示而产生动画效果。也称为Drawable Animation。
    • 属性动画(Property Animation): 通过连续改变对象属性的属性值而产生动画效果。与补间动画只改变控件的四个属性的属性值不同的是属性动画可以改变对象的任何数值类型的属性的属性值。

    10ppt 第3页

    51. NinePatchDrawable是怎么使用的?

    NinePatchDrawable 是用来平滑拉伸图像的边沿的,使用如下:
    NinePatchDrawable使用了一幅NinePatch图像,这种图像要定义拉伸时填充的内容。可以执行SDK/tools/draw9patch.bat或在Android Studio中点击相应的图进行定义。

    11ppt 第11页

    52. Fragment的作用是什么?

    Fragment的作用是:在活动Activity中为不同的屏幕尺寸修改布局配置,解决不同屏幕分辩率的问题,支持动态、灵活的界面设计。

    展开全文
  • 安卓知识点汇总

    2017-02-13 23:22:15
    痛苦的生活,在于才华配不上梦想!! 还好美好之路有迹可循~~
    生活的痛苦,在于才华配不上梦想!!
    还好美好之路有迹可循~~
    

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    展开全文
  • 安卓知识点大全

    2017-12-28 14:56:47
    安卓的四大组件;Activity, Service,(Broadcast Receiver),(Content Provider) 1. Intent分为显式和隐式,活动有四种状态: 运行状态,暂停状态,停止状态,销毁状态;Activity有7种回调方法:onCreate,...

    安卓的四大组件;Activity, Service,(Broadcast Receiver),(Content Provider)
    1. Intent分为显式和隐式,活动有四种状态: 运行状态,暂停状态,停止状态,销毁状态;Activity有7种回调方法:onCreate,onStart,onResume,onPause,onStop,onDestroy,onRestart
    2. 活动的启动模四种standard:系统默认的启动模式,在不进行显示指定的情况下所有活动启用该模式,每当启用一个模式,它都会入伐并处于伐顶位置,singleTop:如果发现返回伐的伐顶已经是该活动,直接使用它,不会再创造新的活动实例,singleTask:让某个活动在整个应用程序中的上下文只存在一个实例,每次启动该活动时系统会在返回伐中检查是否存在该活动的实例,如果已经存在则直接使用该实例,并把在这活动之上的所有活动统统出伐。,singleInstance:启用一个新的返回伐来管理这个活动不管哪个应用访问这个活动,都共同的同一个返回伐,解决了共享活动实例的问题。(在android:launchMode=” singleInstance”来设置)
    3. 3.四种基本布局:LinearLayout,RelativeLyout,FrameLayout,TableLayout
    4. 布局美化:hint的作用是提示信息在文本框,一旦用户输入信息就会消失;maxLines的作用是规定行数,可以在EditText里设置
    5. 有的控件有:TwxtView,Button,EditText,ImageView,ProgressBar: 进度条,AlertDialog:当前页面弹出对话框,ProgressDialog:弹出有进度框的对话框
    6. Android:gravity:指定文字在控件中的对齐方式;Android:layout_gravity:指定控件在布局中的对齐方式;当LinearLayout的排列方向为horizontal(水平)时,控件的宽度不能为match_parent;当排列方向为vertical(垂直)时,控件的高度不能指定为manch_parent;LinearLayout中有一个重要的属性android:layout_weight:按比例指定控件的大小,这在手机的适配性比较重要
    7. 表格布局:不能指定宽度,TableRow:行,android:layout_span:合并单元格,android:strechColumns:表示不能完全沾满屏幕宽度时,就将列拉伸,指定成0为拉伸第一列,指定1则为拉伸第二列
    8. Android:layout_margin:上下左右方向上偏离的距离,要引用自定义控件:,新建TitleLayout继承自LinearLayout,代码如下:LayoutInflater.from(context).inflate(R.layout.title,this);代码解释:通过layoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法动态加载一个布局文件,inflate()接收两个参数,第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局
    9. 安卓程序频幕适配,当需要指定一个固定值时,控件或是布局用dp也就是dip来指定,指定文字时用sp,要设置listview的分割线设置为透明色的代码是android:divider=”#0000”
    10. Fragment为碎片,android:name=”包名.类名”
    11. 碎片的生命周期:运行状态,暂停状态,停止状态,销毁状态;碎片的回调方法除了活动的回调方法,还有一下附加的回调方法:(1)onAttach():碎片和活动建立关联时调用(2)onCreateView():碎片创建视图(加载布局)时调用(3)onActivityCreated():确保碎片相关联的活动一定已经创建完毕时调用(4)onDestroyView当与碎片关联的视图被移除时调用(5)onDetach():当碎片和活动解除关联时调用
    12. TextView的属性,android:padding表示给控件的周围加上补白, android:singleLine设置为true表示这个TextView只能单行显示,android:ellipsize设定当文本内容超出控件宽度时,文本的缩略方式,指定为end表示在尾部进行缩略
    13. ListView:android:entries指定列表数组,android:divider:改变列表的分隔条
    14. 广播可以分为标准广播:完全异步执行的广播,广播不可以截断;有序广播:同步执行的广播,可以被截断;注册广播的方式有两种:动态注册:在代码中注册,可以自由的控制注册和注销,比较灵活,但是必须要在程序启动后才能收到广播;静态注册:在AndroidManifest.xml中注册,在程序未启动的情况下就可以收到广播了,在广播的onReceive()方法中不要添加过多的逻辑或者进行任何的耗时操作,在广播中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束,程序就会报错,广播扮演的角色是打开其它程序的组件,创建一条状态栏通知,启动一个服务等
    15. 提交本地代码:1.建立个本地仓库:cd c:,然后cd …(也就是需要建立仓库的路劲写下了就行了)2.创建仓库:git init这样就完成创建代码的操作,可以通过is –al命令查看一下3.提交代码:git add 文件名(或是src或是.,意思是所有文件)
    16. 数据储蓄有三种方式:1.文件储存2.SharedPreference存储3.数据库存储;文件的存储:Context类提供一个openFileOutput()需要两个参数,一个是文件名,2是文件的操作模式:MODE_PRIVATE(会被覆盖),MODE_APPEND(不会被覆盖)
    17. 文件存储逻辑:通过openFileOutput()方法能得到一个FileOutputStream对象,再借助它构建一个OutputStreamWriter对象,接着使用OutputStreamWriter构建BufferedWriter对象,这样就可以将文本内容写入到文件中了:FileOutputStream out =openFileOutput(“data”,Context.MODE_PRIVATE);BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));writer.write(data);
    18. 从文件中读取数据逻辑代码:FileInputStream in =openFileInput(“data”)//通过openFileInput获得一个FileInputStream 对象。BufferedReader reader=new BufferedReader(new InputStreamReader(in))//使用InputStreamReader构建一个BufferedReader 对象,这可以通过BufferedReader一行行的读取,取回来存放在StringBuilder对象中;知识点:对字符串进行非空判断的时候使用了TextUtils.isEmpty()方法,可以进行两种空值的判断,即当传入的字符串等于NULL或是等于空字符串的时候,都会返回true
    19. 将数据存储到SharedPreferences中有三种方法:1. Context中的getSharedPrefences()方法:要两个参数:指定SharedPreferences文件的名称,另一个参数用于指定操作模式;2.Activity类中的getPreferences中的方法,只接收一个模式参数3.preferenceManager类中的getDefaultSharedPreferences()方法,这是一个静态方法,它接收一个Context参数;得到SharedPreferences对象后,分三部:1.调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象 2.向这个对象添加数据,用putString方法,假如添加的是String对象的话 3.调用commit()方法提交
    20. 创建数据库:SQLiteOpenHelper中有两个构造方法可以重写,构造方法需要传入4个参数,第一个:Context,第二个:数据库名,第三个:允许我们查询数据库的时候返回自定义的Cursor,一般null;第四个:当前数据库的版本号,用于对数据库进行升级;数据库文件存放在/data/data/<包名>/databases/目录下,创建数据库的方法:1.把创建的SQL语句定义成String 2.在onCreate里放入参数onCreate(SQLiteDatabase db)里 3.调用db.execSQL(放入SQL语句定义成String)就能执行创建
    升级数据库:1.在MyDatabaseHelper里写onUpgrade()方法,db.execSQL(“drop table if exists 表名”)删除表,onCreate(db) 2. dbHelper=new MyDatabaseHelper(this,”BookStore.db”,null,2)传入版本2
    数据库的SQL语言:insert:添加,查询:select,更新:update,删除:delete,下面看它们各种需要的参数:insert()接收三个参数,第一个是表名,第二个参数是用于在未指定添加数据的情况下给某些为空的列自动赋值NULL,一般传入NULL,第三个参数是ContentValues对象,它提供一系列的put()方法重载,用于向ContentValues中添加数据;如何新增数据:1.获取到SQLiteDatabase对象,用ContentValues进行组装: SQLiteDatabase db=dbHelper.getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put(“name”, “The Da Vinci Code”);
    db.insert(“Book”, null, values);
    21. 数据库查询:query()需要七个参数:1.表名2.指定查询第几列3.指定where的约束条件4.为where中的占位符提供具体的值(第3,4个参数其实是约束查询某一行或几行的数据,不指定查询所有行)5.指定需要group by的列6.对group by后的结果进行进一步的过滤 7.指定查询结果的排序方式
    22. 查询数据库调用SQLiteDatabase的rawQuery 方法,其它操作调用的是execSQL()方法
    23. 解析异步消息处理机制:异步消息处理机制由四部分组成:Message,Handler,MessageQueue,Looper……它们的作用分别是:(1)Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同的线程中交换数据(2)Handler是处理者的意思。它主要用于发送和处理消息的,发送用sendMessage()方法,接受用handleMessage()方法(3)MessageQue:消息队列的意思,存放所有通过Handler发送的消息,这些消息等待被处理,每个线程中只有一个MessageQueue对象(4)Looper是每个MessgeQueue的管家,每当发现MessgeQueue存在一条消息,就会将它取出,传递到HandleMessage()方法中,每个线程只有一个Looper对象
    24. 使用 AsyncTask: AsyncTask是一个抽象类,必须创建一个子类去继承它,继承时,可以为AsyncTask类指定三个泛型参数:(1)Params:执行AsyncTask时传入的参数,用于后台任务中使用(2)Progress:后台任务执行时,如果需要在界面上显示当前的进度,可以使用指定的泛型作为进度单位(3)Result,当任务执行完毕后,如果需要对结果返回,则使用这里的泛型作为返回值类型,因此一个简单的自定义的AsyncTask可以写成如下公式:class DownloadTask extents AsyncTask

    展开全文
  • 安卓知识点总结

    千次阅读 2015-04-14 18:44:51
    1.控制台输出:called unimplemented OpenGL ES API 调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation ...

    1.控制台输出:called unimplemented OpenGL ES API

    调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了。


    2.控制台输出:


    这个错误是由于真机里已经存在一个相同签名的应用程序,最简单是真机先卸载掉,然后再run。


    3.高德地图android版本,导入地图库,项目打开后报错:

    06-05 09:10:46.718: W/dalvikvm(932): Unable to resolve superclass of Lcom/amapv2/cn/apis/BasicMapActivity; (29)
    06-05 09:10:46.718: W/dalvikvm(932): Link of class 'Lcom/amapv2/cn/apis/BasicMapActivity;' failed

    06-05 09:10:46.888: E/AndroidRuntime(932): FATAL EXCEPTION: main
    06-05 09:10:46.888: E/AndroidRuntime(932): java.lang.ExceptionInInitializerError
    06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstanceImpl(Native Method)
    06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstance(Class.java:1319)
    06-05 09:10:46.888: E/AndroidRuntime(932):         at android.app.Instrumentation.newActivity(Instrumentation.java:1054)


    这个错误是由于你的android开发环境adt升级到最新版本导致的错误,属于你Android开发环境问题,选中你的项目,右击选择“Properties”---------》“Java Build  Path”--------》“Order  and  Export” ,把“Android  Private Libraries”选项打上勾,再次编译就可以了。


    4.android横竖屏锁定:

    xml文件中设置:
      要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。
      代码:
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
      ============延伸========
      屏幕会自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。同时,layout可能因为横屏带来不能合理适配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。这个属性可以理解为一个监听器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值为:keyboardHidden|orientation。


    Socket TCP/UDP通信原理http://wenku.baidu.com/view/47437d4dcf84b9d528ea7a67.html



    5,android 谷歌地图开发时,控制台输出:



    也就是调试时真机运行后地图显示空白。造成这种现状的原因是由于 google api key配置错误。

    Api key分为两种情况

    一种是使用debug keystore生成的api key

    一种是使用release keystore生成的api key

    不同的api key使用不同的sha1字符生成 ,所以如果是调试,如果使用android自带的debug keystore,一定要是当时生成debug api key的那个 keystone。如果是release,自己的keystore来签名,APP配置文件就用 release下生成的api key。不能混用。否则显示不了地图。

    解决办法:

    1,把debug keystone替换成生成 api key 的那个:

    ,

    2,APP配置文件里要启用debug 的 key:



    6,Android Your content must have a ListView whose id attribute is 'android.R.id.list'错误

    错误提示:Your content must have a ListView whose id attribute is 'android.R.id.list'

    对于以上错误,其实可能是因为我们要实现对ListView中setOnItemClick的事件监听而去继承了LiseActivity,但是却没有ListView的标签,网上有说过只要在布局文件中添加如下代码即可:

    1. <ListView     
    2. android:id="@android:id/list" 或android:id="@id/android:list"    
    3. android:layout_width="fill_parent"    
    4. android:layout_height="wrap_content">    
    5. </ListView>    
    <ListView   
    android:id="@android:id/list" 或android:id="@id/android:list"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content">  
    </ListView>  

    7,view的onFinishInflate()何时调用的?

    比如:自定义一个view叫myView ,路径是,com.test.view.MyView,此view是继承LinearLayout,定义的布局文件是my_view.xml
    里面内容是:
    <com.test.view.MyView>
            <xxxx />
    </com.test.view.MyView>

    当在使用的时候,可以这样使用
    MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);
    当加载完成xml后,就会执行那个方法。

    8,onInterceptTouchEvent与onTouchEvent 执行顺序

    ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.


    ViewGroup里的onTouchEvent默认值是false。


    View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件

    http://blog.csdn.net/android_tutor/article/details/7193090


    9,Jar mismatch! Fix your dependencies


    这个问题是我们添加了多个开源应用例如ABS 或者 PageIndicator 由于他们都包含 support V4.jar, 或者你的工程目录里 libs 中包含这个包,所以冲突发生了,他们各自的签名SHA 不一致,解决方案:

    去掉某一个libs里面的supportv4.jar,直接在引用  external jar using build path menu > add external jar,在目录外选一个(supportV4.jar)即可。


    10,明明卸载掉了豌豆荚,可是.apk文件还是显示 wandoujia.file,如何去除?

    开始=运行=输入CMD回车 输入assoc .apk=null (记得assoc后面有个空格和点) 回车即可。



    11,gen already exists but is not a source folder. Convert to a source folder or rename it.



    解决办法:



       1. Right click on the project and go to "Properties" //鼠标右键点击项目,然后选中Properties
       2. Select "Java Build Path" on the left //选择java Build Path
       3. Open "Source" tab // 打开源文件的tab栏
       4. Click "Add Folder..." //点击添加文件夹
       5. Check "gen" folder and click Ok and Ok again //选中gen目录 然后点确定  应该就可以了【保证source下是gen和src,缺少哪个就添加哪个,缺一不可多余的全部删除】

       6. Again right click on the project and in the "Andriod Tools" click on "Fix Project Properties"  //右键点击项目 选择     Andriod Tools 点击 Fix Project Properties

    按照以上做法,虽然library项目不报错了,可是在其它的项目中引用不到library的类,并且library项目本身都无法引用到,如下:




    解决办法:

    右键项目,build path ----->config build path 在SourceTab栏,addFolder:这一回添加src


    在看看项目组织:


    没问题了吧。


    12,获取当前设备屏幕宽度和高度

    1. Display display = getWindowManager().getDefaultDisplay();  
    2. display.getWidth();  
    		Display display = getWindowManager().getDefaultDisplay();
    		display.getWidth();
    1. <span style="white-space:pre">        </span>display.getHeight();  
    <span style="white-space:pre">		</span>display.getHeight();

    13,项目工程下的lint.xml什么作用?


    代码性能改进工具,Lint会自动扫描现有工程的Java和xml文件,给出性能优化改进建议,最终将会在Android的工程目录下生成lint.xml文件。简单点说就是检查项目里不推荐的代码文件。


    14,无论真机还是模拟器运行项目,总是闪退,后台报错Class找不到:



    解决:找半天,clean好多次,都解决不了,一开始以为少了相关的库文件或路径不对,后来才发现,只要把R文件里的所有包下的文件全部remove掉,让系统自动重新生成,就可以拉。



    15,ClassNotFoundException: Didn't find class "org.osmdroid.views.MapView" on path: /data/app/net.yu-2.apk


    这个错误是指apk打包时发现:org.osmdroid.views.MapView找不到,但是我们在代码里,引用此路径,就能找到MapView,后来终于想到:

    这个jar包在Android private Libraries里

    build config里应该勾选这个,否则打包时不会添加android Private Libraries里的库



    16,基于XMPP的android连接openfile服务时出错:SASL authentication DIGEST-MD5 failed 




    出现这个问题是由于客户端连接openfile时SASL验证出错,网上找了些相关资料,说是关闭相关鉴权验证就可以了:

    1. config.setTLSEnabled(false);  
    2. config.setCompressionEnabled(false);  
    3. config.setSelfSignedCertificateEnabled(false);  
    4. config.setSASLAuthenticationEnabled(false);  
    5. config.setVerifyChainEnabled(false);  
    config.setTLSEnabled(false);
    config.setCompressionEnabled(false);
    config.setSelfSignedCertificateEnabled(false);
    config.setSASLAuthenticationEnabled(false);
    config.setVerifyChainEnabled(false);
    可是设置后,还会出现这些错误,终于找到原因,是因为连接服务器时,username和password出错了,看log日志发现我的password传递的为null,所以造成了SASL验证出错。确保你的username和password都有正确的值(和服务器的key对应)就可以了。


    参考文章:

    http://blog.sina.com.cn/s/blog_7e3fa7ec0101894b.html 基于XMPP协议的Android IM研究 

    http://blog.csdn.net/onelight1997/article/details/6301289 gloox 链接openfire服务器问题解决办法

    http://www.oschina.net/question/872914_80498



    17,使用HttpClient时:Target host must not be null, or set in parameters

    出现这个问题,原因是url,连接地址不完整, 必须加上"http://"

    1. HttpPost post = new HttpPost("http://gps.google.com/geo");  
    HttpPost post = new HttpPost("http://gps.google.com/geo");


    18,真机调试时错误:INSTALL_FAILED_INSUFFICIENT_STORAGE

    出现这个问题,原因是设备(真机或模拟器)的内容空间不足,APP无法安装,如过用的手机,删除一些没用的软件腾出一些空间来,如用的是模拟器,设置device的内存更大一些。


    19,如何把工程项目下的文件归档?(use as Source Folder)


    (我们有时候看项目下会有上图中的文件夹打开后都是一层包一层(树状)的并不像com.ka.tradk这样,原因在于当前的包不是Source Folder)

    添加完后感觉特别混乱,还是有错误,就看本文第11个截图的解决办法,右键点击工程,选择 "Properties",选择左边的 "Java Build Path",打开 "Source" 标签面板,点击 "Add Folder...",删除没用的,勾选 "gen和src" 文件夹,点击OK,点击YES,再点击OK。


    20,在java中,如何四舍五入保留小数点x位?

    方法一:

    1. float temp = 0.6922224f;  
    2. BigDecimal bd = new BigDecimal(temp);  
    3. bd =bd.round(new MathContext(2));  
    			float temp = 0.6922224f;
    			BigDecimal bd = new BigDecimal(temp);
    			bd =bd.round(new MathContext(2));
    结果:

    System.out.println("bd:"+bd);               bd =  0.69 

    显然MathContext中的参数就是保留几位小数点,这种方法返回的是对应类型(float)的结果,如上bd

    方法二:

    1. String parten = "#.#";  
    2. DecimalFormat decimal = new DecimalFormat(parten);  
    3. String str= decimal.format(temp);  
    4. interval = Float.valueOf(str);  
    			String parten = "#.#";
    			DecimalFormat decimal = new DecimalFormat(parten);
    			String str= decimal.format(temp);
    			interval = Float.valueOf(str);

    结果:

    System.out.println(interval);    interval = 0.7

    显然这种方法关键的就是parten参数, #.##就是保留两位小数点并且四舍五入,这种方法返回的是字符串类型。


    21,使用eclipse打包时:Export aborted because fatal lint errors were found


    解决办法:

    1,点中项目右键  Properties

    2,左边Android列表打开 Android Lint Preference,如下图:


    3,在上图右上角,点击文字超链接,Configure workspace settings,如下图:


    4,将"Run full error check when exporting app and abort if fatal errors are found "前的勾去掉,点击Apply再点击OK,全部保存。

    5,再次选中项目,鼠标右键,AndroidTools-> Clean Lint Markers。稍等片刻,等待APP清除并重新生成Lint.xml文件。

    这个时候再打包,就不会再有错误了。


    22,listview如何自定义或不显示分割线?

    1,ListView中每个Item项之间都有分割线,设置android:footerDividersEnabled表示是否显示分割线,此属性默认为true。

    1. <ListView  
    2.     android:id="@+id/local_groups_list"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="wrap_content"  
    5.     android:footerDividersEnabled="false" />  
    <ListView
    	android:id="@+id/local_groups_list"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:footerDividersEnabled="false" />
    或是在代码中mListView.setFooterDividersEnabled(false);

    2,改变ListView的分割线颜色和宽度,需要在布局中定义android:divider和android:dividerHeight属性。

    1. <ListView  
    2.     android:id="@+id/local_groups_list"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="wrap_content"  
    5.     android:divider="@color/divider_color"  
    6.     android:dividerHeight="1px" />  
    <ListView
    	android:id="@+id/local_groups_list"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:divider="@color/divider_color"
    	android:dividerHeight="1px" />
    setDivider方法就可以设置自己想要的分割线样式,可以是color也可以是Drawable

    3,也可以设置listview不显示分割线,然后给每一个listview item 的底部添加一个imageview,来充作分割线,这也是一种方法。


    23,android:inputType="numberSigned"和代码EditText中setInputType以及setRawInputType区别

    android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。

        android:inputType="none"
        android:inputType="text"
        android:inputType="textCapCharacters"
        android:inputType="textCapWords"
        android:inputType="textCapSentences"
        android:inputType="textAutoCorrect"
        android:inputType="textAutoComplete"
        android:inputType="textMultiLine"
        android:inputType="textImeMultiLine"
        android:inputType="textNoSuggestions"
        android:inputType="textUri"
        android:inputType="textEmailAddress"
        android:inputType="textEmailSubject"
        android:inputType="textShortMessage"
        android:inputType="textLongMessage"
        android:inputType="textPersonName"
        android:inputType="textPostalAddress"
        android:inputType="textPassword"
        android:inputType="textVisiblePassword"
        android:inputType="textWebEditText"
        android:inputType="textFilter"
        android:inputType="textPhonetic"
    //数值类型
        android:inputType="number"
        android:inputType="numberSigned"
        android:inputType="numberDecimal"
        android:inputType="phone"//拨号键盘
        android:inputType="datetime"
        android:inputType="date"//日期键盘
        android:inputType="time"//时间键盘

    在代码中设置的方法:setInputType和setRawInputType的区别,前者是以TEXT类型的键盘,后者是单独Number类型的键盘:


    fuelcity和fuelhighway都是EditText
    1. fuelCity.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  
    2. fuelHighway.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  
    				fuelCity.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
    				fuelHighway.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);

    1. fuelCity.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);  
    2. hway.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);  
    			        fuelCity.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);
    				fuelHighway.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);

    注意,参数必须要有InputType.TYPE_CLASS_NUMBER,否则会显示全键盘。

    24,从SD卡获取一个png,然后转化为Bitmap或是Imageview

    1. String path = Environment.getExternalStorageDirectory().toString()  
    2.         + "/test.png";  
    3. Bitmap mSharedPic = BitmapFactory.decodeFile(path);  
    		String path = Environment.getExternalStorageDirectory().toString()
    				+ "/test.png";
    		Bitmap mSharedPic = BitmapFactory.decodeFile(path);
    转化为Imageview

    1. ImageView iv = (ImageView) findViewById(R.id.image_test);   
    ImageView iv = (ImageView) findViewById(R.id.image_test); 
    1. iv.setImageBitmap(<span style="font-family:Helvetica,Tahoma,Arial,sans-serif">mSharedPic </span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif">);</span>  
    iv.setImageBitmap(<span style="font-family:Helvetica,Tahoma,Arial,sans-serif">mSharedPic </span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif">);</span>

    25 Android string.xml通配符(%$)和转义字符的用法


    StringFormat通配符 

    <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

    在这个例子中,这个格式化的字符串有2个参数

    属性值举例说明
    %n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格 
    %n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0 
    %n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00


    在程序中按照下面的方法来根据参数来格式化字符串:

    Resources res = getResources();

    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

    1. <string name="info_address">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$md)</string>  
    2. <string name="info_address_english">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>  
    3. <string name="info_address_a">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1fm)</string>  
    4. <string name="info_address_ab">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>  
        <string name="info_address">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$md)</string>
        <string name="info_address_english">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>
        <string name="info_address_a">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1fm)</string>
        <string name="info_address_ab">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>



    XML转义字符 
    以下为XML标志符的数字和字符串转义符 
    "     (&#34; 或 &quot;) 
    '     (&#39; 或 &apos;) 
    &     (&#38; 或 &amp;) 
    lt(<) (&#60; 或 &lt;) 
    gt(>) (&#62; 或 &gt;) 


    比如:在string.xml中定义如下一个字符串, 
    <string name="first">大家好,欢迎来到mryang社区。welcome to here!</string> 
    我想以 
    大家好,欢迎来到eoeandroid社区。 
    welcome to here! 
    两行的形式输出,如何做?加\n,看下面:
     
    <string name="hello">大家好,欢迎来到mryang社区。\nwelcome to here!</string> 

    android中的空格编码 string.xml前后加空格的技巧 
    <string name="space">&#160;&#160;&#160;&#160;我来看空格</string> 
    &#160; 这个就代表着空格
     

    1. 遇到如下错误的时候说明你需要在单引号签名加转义字符(\): 
    Description Resource Path Location Type error: Apostrophe not preceded by \ (in Search' Titles) strings.xml 
    只要将定义的字符串中的单引号('), 修改为(\')即可
     

    2. 变量文本格式(%s)提示: 
    Multiple annotations found at this line: 
    - error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
    attribute? 
    - error: Unexpected end tag string 

    这是由于新的SDK采用了新版本的aapt(Android项目编译器), 这个版本的aapt编译起来会比老版本更加的严格, 在Android最新的开发文档中描述String的部分,已经说明了如何去设置 %s 等符号, 可以点击去看. 
    简单解决方法就是:把%s之类的变量格式替换成%1$s, %1表示第一个位置的变量, $s表示为字符串类型 
    例如: 
    <string name="welcome_messages">Your First Var is %1$s! You Second Var is %2$d.</string>
     


    26,如何导入第三方library库?

    导入的前提是lib已经被添加到了当前workspace里面,这样的话就可以使用相对路径了。


    方法一:

    直接在project.properties里添加:

    1. target=android-17  
    2. android.library.reference.1=..\\LibSlidingMenu2  
    target=android-17
    android.library.reference.1=..\\LibSlidingMenu2


    方法二:

    手动导入:


    导入完成后:


    方法二的和一的区别在于路径引用上,如上图,1,2是方法一来引用的;3,4是方法二引用的。


    27,R cannot be resolved to a variable

    遇到这种情况可以看一下RES里是否有错误,如果有错误,必然导致R无法成功生成,所以先解决所有资源文件的错误。

    1. 检查Android 的SDK是否丢失需要重新下载,检查build path
    2. 确保class没有import Android.R;
    3, 错误class引用的layout的xml文件没有错误
    4. 检查AndroidManifest.xml文件,里边的package,layout配置文件,strings.xml等的字符串全部书写正确
    5. layout的xml文件中引用的strings.xml中的字符串拼写完全正确
    6. 在layout 的xml文件手写添加一个控件,看id能否在R.java中自动生成,如果不能,那很大可能就是这个layout 的xml文件有问题,查看格式是否使用正确,或者包含什么非法字符串,或者调用到了不正确的字符串,等等,可以使用排除法,挨个去掉控件,直到发现error message消失或者id能在R.java中自动生成。
    7. 删掉gen文件夹,使R.java重新自动生成一次,如果不能生成,继续检查layout的xml文件是否有如上不易发觉的问题
    8. Clean project ,重新build,或者重新import project。
    9. 重启eclipse。

    28,当import一个新的android项目时,项目名称上出现一个红色的感叹号,程序不能运行

    右键项目---BuildPath---Configure Build Path, 切换libraries标签页,你应该会看到Android Dependencies里红色的X号,也就是说某一个jar包现在不可用了,查看一下是否jar包路径有变化,修复了就没问题了。

    还有在我们引用第三方jar包或是自己写的support支持库时,一定记得要在project.properties里添加: android.library=true  否则,其它项目引用此库时,是无法生产库名.jar包名的。

    以下为引用:

            你用myeclipse新建 web工程, 在工程目录下会生成一个 .classpath 配置文件, 里面是你工程里面引用的jar的配置。这个.classpath 对你的web工程没有什么影响 
    其实是给 myeclipse 识别的。 你说的这种情况是因为 .classpath 文件里面配置引用了某个jar,但是实际上你的 lib 里面并没有这个jar 所以才会有红色的提示。 
            你不用拿.classpath文件和你的jar一个个去找, 你现在打开MyEclipse 右键单击你的web工程,找到 Build Path > Configure Build Paht... > 然后上面有几个选项卡找到 Libraries。  这里看到的就是你工程里面引用的 所有的 jar , 看看是不是在某个jar图标上有个很小的黄色的感叹号? 
             如果有的话就没错了, 先选中这个jar, 点击右边的 Remove  > 点击OK 等待几秒, 现在web工程上面的红色XX是不是没有了,哈哈。 解释一下: 黄色的感叹号的jar,表示.classpath配置文件引用了jar, 但是实际上lib里面没有这个jar。


    29,如何实现屏幕截图(Mapview)

    直接附上实现代码,截取当前屏幕,并保存到手机内。

    1. public Bitmap takeScreenShot(){  
    2.     View view = this.getWindow().getDecorView();  
    3.     view.setDrawingCacheEnabled(true);  
    4.     view.buildDrawingCache();  
    5.     Bitmap bt = view.getDrawingCache();  
    6.       
    7.     Rect frame = new Rect();  
    8.     view.getWindowVisibleDisplayFrame(frame);  
    9.     int statusHeight = frame.top;  
    10.       
    11.     int width = this.getWindowManager().getDefaultDisplay().getWidth();  
    12.     int height = this.getWindowManager().getDefaultDisplay().getHeight();  
    13.       
    14.     Bitmap create = Bitmap.createBitmap(bt, 0,statusHeight,width,height-statusHeight);  
    15.     mMapView.destroyDrawingCache();  
    16.       
    17.     return create;  
    18. }  
    19.   
    20. public void saveScreenShot(Bitmap bitmap,String filepath){  
    21.       
    22.     FileOutputStream fos = null;  
    23.       
    24.     try {  
    25.         fos = new FileOutputStream(filepath);  
    26.           
    27.         if (null!=fos) {  
    28.             bitmap.compress(CompressFormat.PNG, 90, fos);  
    29.             fos.flush();  
    30.             fos.close();  
    31.             System.out.println("succccesss");  
    32.         }  
    33.           
    34.           
    35.     } catch (FileNotFoundException e) {  
    36.         e.printStackTrace();  
    37.     } catch (IOException e) {  
    38.         // TODO Auto-generated catch block   
    39.         e.printStackTrace();  
    40.     }  
    41.       
    42.       
    43. }  
    	public Bitmap takeScreenShot(){
    		View view = this.getWindow().getDecorView();
    		view.setDrawingCacheEnabled(true);
    		view.buildDrawingCache();
    		Bitmap bt = view.getDrawingCache();
    		
    		Rect frame = new Rect();
    		view.getWindowVisibleDisplayFrame(frame);
    		int statusHeight = frame.top;
    		
    		int width = this.getWindowManager().getDefaultDisplay().getWidth();
    		int height = this.getWindowManager().getDefaultDisplay().getHeight();
    		
    		Bitmap create = Bitmap.createBitmap(bt, 0,statusHeight,width,height-statusHeight);
    		mMapView.destroyDrawingCache();
    		
    		return create;
    	}
    	
    	public void saveScreenShot(Bitmap bitmap,String filepath){
    		
    		FileOutputStream fos = null;
    		
    		try {
    			fos = new FileOutputStream(filepath);
    			
    			if (null!=fos) {
    				bitmap.compress(CompressFormat.PNG, 90, fos);
    				fos.flush();
    				fos.close();
    				System.out.println("succccesss");
    			}
    			
    			
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    	}

    实现:

    1. Bitmap bitmap = takeScreenShot();  
    2. saveScreenShot(bitmap, Constants.defaultScreenPath);  
    			Bitmap bitmap = takeScreenShot();
    			saveScreenShot(bitmap, Constants.defaultScreenPath);


    30,android-support-v4.jar混乱冲突


    这是由于不同的library同时引用了android-support-v4.jar,但是他们不是同一个文件,SHA-1不相同,系统只允许libraries must be the same,所以我们删除那个不相同的jar包,把其余的使用同一个的jar拷贝到library里就可以了。


    31,eclipse中git插件的cannot open git-upload-pack问题


    我们在eclipse上使用插件egit向代码服务器push或pull代码时,有时候会发现出现cannot open git-upload-pack这个问题。一般引起这个问题的原因有两个:

    一、网络问题,确定你可以访问自己所要操作的代码仓库地址!【这是最关键的,我就是折腾半天发现公司关闭了地址的外网访问】

    二、eclipse中git插件的配置问题。

    打开eclipse中的windows-->Preferences-->Team-->Git-->Configuration-->User Settings.然后点Add Entry新建一个键值对,输入http.sslVerify=false。如图所示:


    32,Fragment出现异常:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

    在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码

    1. Bundle b = new Bundle();  
    2. b.putParcelable("bitmap", bitmap2);  
    3. imageRecognitionFragment.setArguments(b);  
    		Bundle b = new Bundle();
    		b.putParcelable("bitmap", bitmap2);
    		imageRecognitionFragment.setArguments(b);
    设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报这这个异常

    分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
    这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了。


    33,conversion to dalvik format failed with error 1


    在我们Android Tools--Export Signed Application Package 进行签名打包时会遇到这个问题,不是特别严重的问题,最简单的是刷新一下自己的工程,clean一下、再次打包,如果还不行就重新打开eclipse试试。

    project.properties里Target改变一个其他的版本,再变回来保存一下(相当于刷新的操作)这样也能起到清理的作用。


    34,在版本更新时,新版本数据库增加了字段,安装直接替换apk运行后报错(数据库字段找不到),除非卸载旧版本再安装新的


    主要是因为新增加了字段,在当前版本里查找字段时出错了,所以要切记一个问题,当更新版本时添加或删除了字段,数据库version一定要更换,也就是说新版本运行时要让系统知道数据库有更新,要remove db 然后再创建db,如下所示:


    35,android:layout_weight用法

    layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。默认为零,意思是需要显示 多大的视图就占据多大的屏幕空 间。若赋一个高于零的值,则将父视 图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight 值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。 

    举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。 该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。  如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。 


    36,xml文件中的转义字符

     HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用他们的转义序列,如下所示:

    &amp; 或 &

    &

    &lt; 或 <

    <

    小于号

    &gt; 或 >

    >

    大于号

    &quot;

    "

    双引号

     

    &nbsp;

     

     

    空格

    &copy;

    ©

    版权符

    &reg

    ®

    注册符

      前者为字符转义序列,后者为数字转义序列。数字转为字符对应的ASCII码值。例如 & lt; font &gt;显示为,<font>,若直接写为则被认为是个链接签。

      需要说明的是:

      a. 转义序列各字符间不能有空格; 
             b. 转义序列必须以";"结束; 
         c. 独立的&不被认为是转义开始; 
            d.区分大小写。

      另一个需要转义的字符是引号,他的转义序列为"" "或"""

      HTML使用的字符集是ISO &859 Larin-1字符集,该字符集中有许多标准键盘上无法输入的字符。对这些特别字符只能使用转义序列。
      XML转义字符 
           不合法的XML字符必须被替换为相应的实体。

      如果在XML文件中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是个新元素的开始。所以不应该像下面那样书写代码:

    <message>if salary < 1000 then</message>

      为了避免出现这种情况,必须将字符"<" 转换成实体,像下面这样:

    <message>if salary &lt; 1000 then</message>

      下面是五个在XML文件中预定义好的实体:

    &lt;

    <

    小于号

    &gt;

    >

    大于号

    &amp;

    &

    &apos;

    单引号

    &quot;

    "

    双引号

      实体必须以符号"&"开头,以符号";"结尾。

      注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是个好习惯。


    37,如何读取当前项目版本信息(version name和version code)?

    1. PackageManager packageManager = getPackageManager();  
    2. PackageInfo packInfo = null;  
    3. try {  
    4.     packInfo = packageManager.getPackageInfo(getPackageName(), 0);  
    5. catch (NameNotFoundException e) {  
    6.     e.printStackTrace();  
    7. }  
    			PackageManager packageManager = getPackageManager();
    			PackageInfo packInfo = null;
    			try {
    				packInfo = packageManager.getPackageInfo(getPackageName(), 0);
    			} catch (NameNotFoundException e) {
    				e.printStackTrace();
    			}
    1. <span style="white-space:pre">            </span>int versionName = packInfo.versionName;  
    2.             int versionCode = packInfo.versionCode;  
    <span style="white-space:pre">			</span>int versionName = packInfo.versionName;
    			int versionCode = packInfo.versionCode;

    38,如何判断当前是否有网络以及使用的网络环境(2G、3G或WIFI)?

    1. /** 
    2.  * 判断当前是否有网络 有 返回 true 无 返回 false 
    3.  *  
    4.  * @param context 
    5.  * @return 
    6.  */  
    7. public static boolean isNetWorkAble(Context context) {  
    8.   
    9.     if (context == null) {  
    10.         throw new NullPointerException("context can`t be null!");  
    11.     }  
    12.     ConnectivityManager connManager = (ConnectivityManager) context  
    13.             .getSystemService(Context.CONNECTIVITY_SERVICE);  
    14.     if (null != connManager) {  
    15.         NetworkInfo[] networkinfo = connManager.getAllNetworkInfo();  
    16.         if (null != networkinfo) {  
    17.             for (int i = 0; i < networkinfo.length; i++) {  
    18.                 if (networkinfo[i].getState() == NetworkInfo.State.CONNECTED) {  
    19.                     return true;  
    20.                 }  
    21.             }  
    22.         }  
    23.   
    24.     }  
    25.     return false;  
    26. }  
    	/**
    	 * 判断当前是否有网络 有 返回 true 无 返回 false
    	 * 
    	 * @param context
    	 * @return
    	 */
    	public static boolean isNetWorkAble(Context context) {
    
    		if (context == null) {
    			throw new NullPointerException("context can`t be null!");
    		}
    		ConnectivityManager connManager = (ConnectivityManager) context
    				.getSystemService(Context.CONNECTIVITY_SERVICE);
    		if (null != connManager) {
    			NetworkInfo[] networkinfo = connManager.getAllNetworkInfo();
    			if (null != networkinfo) {
    				for (int i = 0; i < networkinfo.length; i++) {
    					if (networkinfo[i].getState() == NetworkInfo.State.CONNECTED) {
    						return true;
    					}
    				}
    			}
    
    		}
    		return false;
    	}
    判断网络环境:



    39,This tag and its children can be replaced by one <TextView/> and a compound drawable

    当我们在xml里布局的时候,有时会遇到这样的一段黄色警告,简而言之就是说,我们可以优化一些(TextView可以直接添加图片)

    1.    <LinearLayout   
    2.        android:orientation="horizontal"  
    3.        android:layout_centerInParent="true"  
    4.     android:layout_height="wrap_content"  
    5.     android:layout_width="wrap_content">  
    6.     <ImageView   
    7.         android:id="@+id/item_icon"  
    8.         android:layout_width="wrap_content"  
    9.         android:layout_height="wrap_content"/>  
    10.     <TextView  
    11.         android:id="@+id/item_text"  
    12.         android:layout_height="wrap_content"  
    13.         android:layout_width="wrap_content"  
    14.         android:text="@string/app_name"/>  
    15. </LinearLayout>  
        <LinearLayout 
            android:orientation="horizontal"
            android:layout_centerInParent="true"
    	    android:layout_height="wrap_content"
    	    android:layout_width="wrap_content">
    	    <ImageView 
    	        android:id="@+id/item_icon"
    	        android:layout_width="wrap_content"
    	        android:layout_height="wrap_content"/>
    		<TextView
    		    android:id="@+id/item_text"
    		    android:layout_height="wrap_content"
    		    android:layout_width="wrap_content"
    		    android:text="@string/app_name"/>
    	</LinearLayout>
    看这个xml,发现原来可以直接给TextView加图片.. ,通过 setCompoundDrawable 方法, 或者直接在xml中使用android:drawableLeft.、android:drawableRight等属性指定!这样的话就省去了一个ImageView组件,岂不是更有效率一些?

    40,SQlite 简单 事物处理

    最近在做应用程序的集团版本,初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。应用有的账号有500+记录,需要500多次循环,insert。


    解决方法:
    添加事务处理,把500+条插入作为一个事务

    我们使用SQLite的事务进行控制:
            db.beginTransaction();  //手动设置开始事务
            try{
                //批量处理操作
                for(Collection c:colls){
                    insert(db, c);
                }
                db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
               }catch(Exception e){
                   MyLog.printStackTraceString(e);
               }finally{
                   db.endTransaction(); //处理完成
               }

    1.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。
    2.下面两条SQL语句在同一个事务中执行:

    1. try {  
    2.     database.beginTransaction();//开始事务   
    3.     for (Tracker tracker : lists) {  
    4.         Tracker t = findByTid(tracker.getTid()); //读取一条记录   
    5.         if (t != null) {  
    6.             tracker.setId(t.getId());//设置相应的属性   
    7.             tracker.setSelected(t.isSelected());  
    8.             tracker.setDeleted(t.isDeleted());  
    9.         }  
    10.         dao.createOrUpdate(tracker);//循环插入记录   
    11.     }  
    12.     database.setTransactionSuccessful();//保存提交   
    13.     database.endTransaction();//结束事务   
    14.   
    15. catch (Exception e) {  
    16. }  
    		try {
    			database.beginTransaction();//开始事务
    			for (Tracker tracker : lists) {
    				Tracker t = findByTid(tracker.getTid()); //读取一条记录
    				if (t != null) {
    					tracker.setId(t.getId());//设置相应的属性
    					tracker.setSelected(t.isSelected());
    					tracker.setDeleted(t.isDeleted());
    				}
    				dao.createOrUpdate(tracker);//循环插入记录
    			}
    			database.setTransactionSuccessful();//保存提交
    			database.endTransaction();//结束事务
    
    		} catch (Exception e) {
    		}


    41,使用googleMap如何获取两点(经纬度之间的距离)

    方法一:

    1. /** 
    2.  * 通过Location类获取两点间距离 单位:m 
    3.  *  
    4.  * @param slat起点经度 
    5.  * @param slon起点纬度 
    6.  * @param elat终点经度 
    7.  * @param elon终点纬度 
    8.  * @return 
    9.  */  
    10. public static int getDistance(double slat, double slon, double elat,  
    11.         double elon) {  
    12.     float[] result = new float[1];  
    13.     Location.distanceBetween(slat, slon, elat, elon, result);  
    14.     return (int) result[0];  
    15. }  
    	/**
    	 * 通过Location类获取两点间距离 单位:m
    	 * 
    	 * @param slat起点经度
    	 * @param slon起点纬度
    	 * @param elat终点经度
    	 * @param elon终点纬度
    	 * @return
    	 */
    	public static int getDistance(double slat, double slon, double elat,
    			double elon) {
    		float[] result = new float[1];
    		Location.distanceBetween(slat, slon, elat, elon, result);
    		return (int) result[0];
    	}

    在没有类似android的Location的distanceBetween方法开采用如下代码获取:

    1. double distance(double lat1, double lon1, double lat2, double lon2) {     
    2.         double theta = lon1 - lon2;     
    3.         double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))     
    4.                     + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))     
    5.                     * Math.cos(deg2rad(theta));     
    6.         dist = Math.acos(dist);     
    7.         dist = rad2deg(dist);     
    8.         double miles = dist * 60 * 1.1515;     
    9.         return miles;     
    10.     }     
    11.     //将角度转换为弧度      
    12.     static double deg2rad(double degree) {     
    13.         return degree / 180 * Math.PI;     
    14.     }     
    15.     //将弧度转换为角度      
    16.     static double rad2deg(double radian) {     
    17.         return radian * 180 / Math.PI;     
    18.     }     
    double distance(double lat1, double lon1, double lat2, double lon2) {   
            double theta = lon1 - lon2;   
            double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))   
                        + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))   
                        * Math.cos(deg2rad(theta));   
            dist = Math.acos(dist);   
            dist = rad2deg(dist);   
            double miles = dist * 60 * 1.1515;   
            return miles;   
        }   
        //将角度转换为弧度   
        static double deg2rad(double degree) {   
            return degree / 180 * Math.PI;   
        }   
        //将弧度转换为角度   
        static double rad2deg(double radian) {   
            return radian * 180 / Math.PI;   
        }   


    42,Android 之Gson如何使用

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
    jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list

    实体类:

    1. public class Student {  
    2.     private int id;  
    3.     private String name;  
    4.     private Date birthDay;  
    5.   
    6.     public int getId() {  
    7.         return id;  
    8.     }  
    9.   
    10.     public void setId(int id) {  
    11.         this.id = id;  
    12.     }  
    13.   
    14.     public String getName() {  
    15.         return name;  
    16.     }  
    17.   
    18.     public void setName(String name) {  
    19.         this.name = name;  
    20.     }  
    21.   
    22.     public Date getBirthDay() {  
    23.         return birthDay;  
    24.     }  
    25.   
    26.     public void setBirthDay(Date birthDay) {  
    27.         this.birthDay = birthDay;  
    28.     }  
    29.   
    30.     @Override  
    31.     public String toString() {  
    32.         return "Student [birthDay=" + birthDay + ", id=" + id + ", name="  
    33.                 + name + "]";  
    34.     }  
    35.   
    36. }  
    public class Student {
    	private int id;
    	private String name;
    	private Date birthDay;
    
    	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;
    	}
    
    	public Date getBirthDay() {
    		return birthDay;
    	}
    
    	public void setBirthDay(Date birthDay) {
    		this.birthDay = birthDay;
    	}
    
    	@Override
    	public String toString() {
    		return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
    				+ name + "]";
    	}
    
    }

    测试类(Gson使用)

    1. import java.util.ArrayList;  
    2. import java.util.Date;  
    3. import java.util.List;  
    4.   
    5. import com.google.gson.Gson;  
    6. import com.google.gson.reflect.TypeToken;  
    7.   
    8. public class GsonTest1 {  
    9.   
    10.     public static void main(String[] args) {  
    11.         Gson gson = new Gson();  
    12.   
    13.         Student student1 = new Student();  
    14.         student1.setId(1);  
    15.         student1.setName("kaka");  
    16.         student1.setBirthDay(new Date());  
    17.   
    18.         // //   
    19.         System.out.println("----------简单对象之间的转化-------------");  
    20.         // 简单的bean转为json   
    21.         String s1 = gson.toJson(student1);  
    22.         System.out.println("简单Bean转化为Json===" + s1);  
    23.   
    24.         // json转为简单Bean   
    25.         Student student = gson.fromJson(s1, Student.class);  
    26.         System.out.println("Json转为简单Bean===" + student);  
    27.       
    28.         // 简单Bean转化为Json==={"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:27:52 AM"}   
    29.         // Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,name=kaka]   
    30.   
    31.         Student student2 = new Student();  
    32.         student2.setId(2);  
    33.         student2.setName("coco");  
    34.         student2.setBirthDay(new Date());  
    35.   
    36.         Student student3 = new Student();  
    37.         student3.setId(3);  
    38.         student3.setName("caca");  
    39.         student3.setBirthDay(new Date());  
    40.   
    41.         List<Student> list = new ArrayList<Student>();  
    42.         list.add(student1);  
    43.         list.add(student2);  
    44.         list.add(student3);  
    45.   
    46.         System.out.println("----------带泛型的List之间的转化-------------");  
    47.         // 带泛型的list转化为json   
    48.         String s2 = gson.toJson(list);  
    49.         System.out.println("带泛型的list转化为json==" + s2);  
    50.   
    51.         // json转为带泛型的list   
    52.         List<Student> retList = gson.fromJson(s2,  
    53.                 new TypeToken<List<Student>>() {  
    54.                 }.getType());  
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    public class GsonTest1 {
    
    	public static void main(String[] args) {
    		Gson gson = new Gson();
    
    		Student student1 = new Student();
    		student1.setId(1);
    		student1.setName("kaka");
    		student1.setBirthDay(new Date());
    
    		// //
    		System.out.println("----------简单对象之间的转化-------------");
    		// 简单的bean转为json
    		String s1 = gson.toJson(student1);
    		System.out.println("简单Bean转化为Json===" + s1);
    
    		// json转为简单Bean
    		Student student = gson.fromJson(s1, Student.class);
    		System.out.println("Json转为简单Bean===" + student);
    	
    		// 简单Bean转化为Json==={"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:27:52 AM"}
    		// Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,name=kaka]
    
    		Student student2 = new Student();
    		student2.setId(2);
    		student2.setName("coco");
    		student2.setBirthDay(new Date());
    
    		Student student3 = new Student();
    		student3.setId(3);
    		student3.setName("caca");
    		student3.setBirthDay(new Date());
    
    		List<Student> list = new ArrayList<Student>();
    		list.add(student1);
    		list.add(student2);
    		list.add(student3);
    
    		System.out.println("----------带泛型的List之间的转化-------------");
    		// 带泛型的list转化为json
    		String s2 = gson.toJson(list);
    		System.out.println("带泛型的list转化为json==" + s2);
    
    		// json转为带泛型的list
    		List<Student> retList = gson.fromJson(s2,
    				new TypeToken<List<Student>>() {
    				}.getType());
    1.     for (Student stu : retList) {  
    2.         System.out.println(stu);  
    3.     }  
    4.   
    5.     // 结果:   
    6.     // 带泛型的list转化为json==[{"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":2,"name":"coco","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 8:28:52 AM"}]   
    7.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=kaka]   
    8.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=coco]   
    9.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=caca]   
    10.   
    11. }  
    		for (Student stu : retList) {
    			System.out.println(stu);
    		}
    
    		// 结果:
    		// 带泛型的list转化为json==[{"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":2,"name":"coco","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 8:28:52 AM"}]
    		// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=kaka]
    		// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=coco]
    		// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=caca]
    
    	}
    }
    

    43,Hashmap如何遍历所有的key?

    方法一:

    1. Map map = new HashMap();  
    2. Iterator iter = map.entrySet().iterator();  
    3. while (iter.hasNext()) {  
    4.     //通过Entity获得当前item   
    5.     Map.Entry entry = (Map.Entry) iter.next();  
    6.     Object key = entry.getKey();  
    7.     Object value = entry.getValue();  
    8.      
    9. }  
    Map map = new HashMap();
    Iterator iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        //通过Entity获得当前item
        Map.Entry entry = (Map.Entry) iter.next();
        Object key = entry.getKey();
        Object value = entry.getValue();
       
    }

    方法二:

    1. HashMap<String, String> maps = new HashMap<String, String>();  
    2.       Iterator it= maps.keySet().iterator();  
    3.       while (it.hasNext())  
    4.       {  
    5.        Object key=it.next();  
    6.        System.out.println("key:"+key);  
    7.        System.out.println("value:"+maps.get(key));  
    8.       }  
    	HashMap<String, String> maps = new HashMap<String, String>();
    		  Iterator it= maps.keySet().iterator();
    		  while (it.hasNext())
    		  {
    		   Object key=it.next();
    		   System.out.println("key:"+key);
    		   System.out.println("value:"+maps.get(key));
    		  }


    44,Android中Parcelable注意事项

    在实例化对象时,如果实现了Parcelable接口,一定注意两个方法中,get/set属性的顺序不要错了,否则会造成数据不一致。



    45,Fragment异常:not attached to Activity

    传送门:http://blog.csdn.net/walker02/article/details/7995407


    46,Android自带Location和百度DistanceUtil计算两点间距离

    1. float[] results = new float[1];  
    2. double lat = 144122796/3600000.0;  
    3. double lon = 418747182/3600000.0;  
    4. double plat =144121792/3600000.0;  
    5. double plon =418749216/3600000.0;  
    6. Location.distanceBetween(lat, lon, plat, plon, results);  
    7. System.out.println("Location:"+results[0]);  
    8. GeoPoint start = new GeoPoint((int) (144122796 / 3.6), (int) (418747182 / 3.6));  
    9. GeoPoint end = new GeoPoint((int) (144121792 / 3.6), (int) (418749216 / 3.6));  
    10. double distance = DistanceUtil.getDistance(start, end);  
    11. System.out.println("baidu:"+distance);  
    		float[] results = new float[1];
    		double lat = 144122796/3600000.0;
    		double lon = 418747182/3600000.0;
    		double plat =144121792/3600000.0;
    		double plon =418749216/3600000.0;
    		Location.distanceBetween(lat, lon, plat, plon, results);
    		System.out.println("Location:"+results[0]);
    		GeoPoint start = new GeoPoint((int) (144122796 / 3.6), (int) (418747182 / 3.6));
    		GeoPoint end = new GeoPoint((int) (144121792 / 3.6), (int) (418749216 / 3.6));
    		double distance = DistanceUtil.getDistance(start, end);
    		System.out.println("baidu:"+distance);

    输出:

    01-21 14:33:33.060: I/System.out(6935): Location:57.310047
    01-21 14:33:33.060: I/System.out(6935): baidu:56.9168298996976

    可以看出百度和Android自带的算法计算出来的差距不是很大,其实出现不一样的结果,主要是算法过程中,椭球中的地球长半径数据不一致(WGS84和天朝的标准,你懂的),导致差异,具体可看如下算法公式。


    47,国际国内通用两点间(经纬度)的距离算法:

    1. static double DEF_PI = 3.14159265359// PI   
    2. static double DEF_2PI = 6.28318530712// 2*PI   
    3. static double DEF_PI180 = 0.01745329252// PI/180.0   
    4. static double DEF_R = 6370693.5// radius of earth   
    5.   
    6. /** 
    7.  * 利用勾股定理计算,适用于两点距离很近的情况 
    8.  *  
    9.  * @param lon1 
    10.  * @param lat1 
    11.  * @param lon2 
    12.  * @param lat2 
    13.  * @return 
    14.  */  
    15. public double GetShortDistance(double lon1, double lat1, double lon2,  
    16.         double lat2) {  
    17.     double ew1, ns1, ew2, ns2;  
    18.     double dx, dy, dew;  
    19.     double distance;  
    20.     // 角度转换为弧度   
    21.     ew1 = lon1 * DEF_PI180;  
    22.     ns1 = lat1 * DEF_PI180;  
    23.     ew2 = lon2 * DEF_PI180;  
    24.     ns2 = lat2 * DEF_PI180;  
    25.     // 经度差   
    26.     dew = ew1 - ew2;  
    27.     // 若跨东经和西经180 度,进行调整   
    28.     if (dew > DEF_PI)  
    29.         dew = DEF_2PI - dew;  
    30.     else if (dew < -DEF_PI)  
    31.         dew = DEF_2PI + dew;  
    32.     dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)   
    33.     dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)   
    34.     // 勾股定理求斜边长   
    35.     distance = Math.sqrt(dx * dx + dy * dy);  
    36.     return distance;  
    37. }  
    38.   
    39. /** 
    40.  * 按标准的球面大圆劣弧长度计算,适用于距离较远的情况 
    41.  *  
    42.  * @param lon1 
    43.  * @param lat1 
    44.  * @param lon2 
    45.  * @param lat2 
    46.  * @return 
    47.  */  
    48. public double GetLongDistance(double lon1, double lat1, double lon2,  
    49.         double lat2) {  
    50.     double ew1, ns1, ew2, ns2;  
    51.     double distance;  
    52.     // 角度转换为弧度   
    53.     ew1 = lon1 * DEF_PI180;  
    54.     ns1 = lat1 * DEF_PI180;  
    55.     ew2 = lon2 * DEF_PI180;  
    56.     ns2 = lat2 * DEF_PI180;  
    57.     // 求大圆劣弧与球心所夹的角(弧度)   
    58.     distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)  
    59.             * Math.cos(ns2) * Math.cos(ew1 - ew2);  
    60.     // 调整到[-1..1]范围内,避免溢出   
    61.     if (distance > 1.0)  
    62.         distance = 1.0;  
    63.     else if (distance < -1.0)  
    64.         distance = -1.0;  
    65.     // 求大圆劣弧长度   
    66.     distance = DEF_R * Math.acos(distance);  
    67.     return distance;  
    68. }  
    69.   
    70. /** 示例 */  
    71. double mLat1 = 39.90923// point1纬度   
    72. double mLon1 = 116.357428// point1经度   
    73. double mLat2 = 39.90923;// point2纬度   
    74. double mLon2 = 116.397428;// point2经度   
    75. double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);  
    	static double DEF_PI = 3.14159265359; // PI
    	static double DEF_2PI = 6.28318530712; // 2*PI
    	static double DEF_PI180 = 0.01745329252; // PI/180.0
    	static double DEF_R = 6370693.5; // radius of earth
    
    	/**
    	 * 利用勾股定理计算,适用于两点距离很近的情况
    	 * 
    	 * @param lon1
    	 * @param lat1
    	 * @param lon2
    	 * @param lat2
    	 * @return
    	 */
    	public double GetShortDistance(double lon1, double lat1, double lon2,
    			double lat2) {
    		double ew1, ns1, ew2, ns2;
    		double dx, dy, dew;
    		double distance;
    		// 角度转换为弧度
    		ew1 = lon1 * DEF_PI180;
    		ns1 = lat1 * DEF_PI180;
    		ew2 = lon2 * DEF_PI180;
    		ns2 = lat2 * DEF_PI180;
    		// 经度差
    		dew = ew1 - ew2;
    		// 若跨东经和西经180 度,进行调整
    		if (dew > DEF_PI)
    			dew = DEF_2PI - dew;
    		else if (dew < -DEF_PI)
    			dew = DEF_2PI + dew;
    		dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
    		dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
    		// 勾股定理求斜边长
    		distance = Math.sqrt(dx * dx + dy * dy);
    		return distance;
    	}
    
    	/**
    	 * 按标准的球面大圆劣弧长度计算,适用于距离较远的情况
    	 * 
    	 * @param lon1
    	 * @param lat1
    	 * @param lon2
    	 * @param lat2
    	 * @return
    	 */
    	public double GetLongDistance(double lon1, double lat1, double lon2,
    			double lat2) {
    		double ew1, ns1, ew2, ns2;
    		double distance;
    		// 角度转换为弧度
    		ew1 = lon1 * DEF_PI180;
    		ns1 = lat1 * DEF_PI180;
    		ew2 = lon2 * DEF_PI180;
    		ns2 = lat2 * DEF_PI180;
    		// 求大圆劣弧与球心所夹的角(弧度)
    		distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)
    				* Math.cos(ns2) * Math.cos(ew1 - ew2);
    		// 调整到[-1..1]范围内,避免溢出
    		if (distance > 1.0)
    			distance = 1.0;
    		else if (distance < -1.0)
    			distance = -1.0;
    		// 求大圆劣弧长度
    		distance = DEF_R * Math.acos(distance);
    		return distance;
    	}
    
    	/** 示例 */
    	double mLat1 = 39.90923; // point1纬度
    	double mLon1 = 116.357428; // point1经度
    	double mLat2 = 39.90923;// point2纬度
    	double mLon2 = 116.397428;// point2经度
    	double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);


    48,Unable to execute dex: Java heap space Java heap space

    修改eclipse目录下面额eclipse.ini文件 
    把第一行添加 
    -vm
    C:\Program Files\Java\jdk1.6.0_24\bin\javaw.exe (你jdk的目录)

    修改
    -Xms128m
    -Xmx512m
    修改
    --launcher.XXMaxPermSize
    512m


    49,如何判断后台的service是否在运行?

    1. public boolean isServiceRunning() {  
    2.     ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
    3.   
    4.     ArrayList<ActivityManager.RunningServiceInfo> servicelist = (ArrayList<RunningServiceInfo>) manager  
    5.             .getRunningServices(30);  
    6.     if (servicelist.size() <= 0) {  
    7.         return false;  
    8.     }  
    9.     for (int i = 0; i < servicelist.size(); i++) {  
    10.         if (servicelist.get(i).service.getClassName().equals(  
    11.                 "com.dbjtech.find.UploadService")) {//我自己的服务   
    12.             return true;  
    13.         }  
    14.   
    15.     }  
    16.   
    17.     return false;  
    18.   
    19. }  
    	public boolean isServiceRunning() {
    		ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    
    		ArrayList<ActivityManager.RunningServiceInfo> servicelist = (ArrayList<RunningServiceInfo>) manager
    				.getRunningServices(30);
    		if (servicelist.size() <= 0) {
    			return false;
    		}
    		for (int i = 0; i < servicelist.size(); i++) {
    			if (servicelist.get(i).service.getClassName().equals(
    					"com.dbjtech.find.UploadService")) {//我自己的服务
    				return true;
    			}
    
    		}
    
    		return false;
    
    	}

    50,android:process=":remote"有啥用?

    android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。


    51,sdk manager更新失败,显示Download interrupted: read timed out


    解决办法:

    sdk manager左上角选tools,再选options,将下面的force https......勾选上,重启sdk manager再试一下,应该可以成功。

    52,eclipse中shift+ctrl+(Format)偶尔失效

    其实是和别的软件的快捷键产生了冲突,具体可以看看最近安装了什么软件,看一下其热键。

    在"Window"->"Preferences"->"General"->"Keys"中可以看到所有快捷键,看看你所用的快捷键是否被修改了,要是修改了的话点击"Restore Defaults"即可,或是把format的热键改成别的。

    【注意】搜狗输入法是最喜欢使用shift+ctrl+字母或数字作为快捷键的,建议打开输入法设置属性--按键-快捷按键,把相关没用的全部取消了。


    53,eclipse里找不到AVDManager 或Android SDK Manager的图标(已安装ADT插件)

    1,查看当前的ADT是否是最新版本的,不是的话建议升级为最新版-help-install new software ,add https://dl-ssl.google.com/android/eclipse/

    2,ADT没问题的话,打开Window-Customize Perspective,切换到Command Groups Availability 勾选上Android相关的选项,这个标签页就是配置工具栏要显示的功能列表,shortcuts标签页是设置比如NEW或show view时所需要显示的功能。



    54,再按一次退出程序的实现方法

    1. private long exittime;(全局)  
    private long exittime;(全局)
    1. if (keyCode == KeyEvent.KEYCODE_BACK) {  
    2.     if ((System.currentTimeMillis() - exittime) > 2000) {  
    3.         Toast.makeText(this"再按一次退出程序", Toast.LENGTH_SHORT).show();  
    4.         exittime = System.currentTimeMillis();  
    5.   
    6.     } else {  
    7.         finish();  
    8.     }  
    9.     return true;  
    10. }  
    		if (keyCode == KeyEvent.KEYCODE_BACK) {
    			if ((System.currentTimeMillis() - exittime) > 2000) {
    				Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
    				exittime = System.currentTimeMillis();
    
    			} else {
    				finish();
    			}
    			return true;
    		}

    55,if (null == name)将null写在前面有什么说道?
    在java里面,它们是一样的。但是为什么把name==null写成是null==name,具体点来说,是在C语言里面引申出来的。
    在C语言里面,为了防止少敲一个等号,编程人员仍然能在编译的时候找到错误。因为if(name=null)是在编译的时候,不会出现错误,而if(null=name)是会编译出错。

    故而,null==name,是在C语言的编程习惯引入进来的。当然了,在java里面,if(name=null)是会出现编译错误的,现在就不用担心这个了。但是,良好的编程习惯,还是写成null==name的好。http://bbs.csdn.net/topics/360174215

    56,Only the original thread that created a view hierarchy can touch its views.

    android中相关的view和控件不是线程安全的,我们必须单独做处理。我直接在button的onclick事件里进行了for循环,循环里直接进行了:

    mHandler.removeCallbacks(runnable);

    mHandler.post(runnable);

    所有更新UI相关的操作,如果在子线程里进行,需要使用handler机制,在handler内更新。

    57,Only the original thread that created a view hierarchy can touch its views


    android中相关的view和控件不是线程安全的,我们必须单独做处理。简而言之,在子线程里进行了UI更新的相关操作,所以要使用Handler机制。


    58,手机号正则表达式"^1[3|4|5|8]\\d{9}$"

    ^ 首字母( 表示匹配一行的开始,既这个验证从^之后开始,第一位数就是1 )

     1  必须是1
    [3-8] 第二个数字为3-8之间的(如果想匹配移动手机号,便可以从这里修改[3|4|5|8])
    \\d表示数字(+\\d表示正整数)
    {9}表示9个,就是9个数字(后面的9位每位都是从0-9之间的数字)
    $ 结尾(匹配结束)

    59,java.lang.IllegalStateException: Content has been consumed
    这个问题是在使用HttpClient时遇到的,主要原因是多次调用了:
    1. reply = EntityUtils.toString(response.getEntity());   
     reply = EntityUtils.toString(response.getEntity()); 
    httpEntity.getContent()只能读取一次,多次读取的话就会出现这个Exception了。

    60,Listview如何选中某一行item?(当前item自动滚动)
    1,即可直接选择到指定的 item 并置顶
    1. listView.setSelection(index);  
    listView.setSelection(index);

    2,尝试获取每个item的高度,然后根据指定的个数,使用:
    1. listView.scrollTo(0, index * heightPerItem);  
    listView.scrollTo(0, index * heightPerItem);
     每个 item 高度的计算有很多种方法,最简单的就是看你的布局如何实现的,直接写入数值即可如果是不确定的高度,那就只有等实例化之后才能 getHeigth 也可以获取。
     高度的计算需要待 listView 加载完毕后才获取其实际的高度,否则会得到 0。还有就是用 measure 方法:
    1.  ListAdapter listAdapter = listView.getAdapter();    
    2.     int totalHeight = 0;   
    3.     for (int i = 0; i < listAdapter.getCount(); i++) {   
    4.         View listItem = listAdapter.getView(i, null, listView);   
    5.         listItem.measure(00);   
    6.         totalHeight += listItem.getMeasuredHeight();   
    7.     }   
    8.     ViewGroup.LayoutParams params = listView.getLayoutParams();   
    9.     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() – 1));   
    10.     ((MarginLayoutParams)params).setMargins(10101010);  
    11.     listView.setLayoutParams(params);   
    12. 还有子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。  
     ListAdapter listAdapter = listView.getAdapter();  
        int totalHeight = 0; 
        for (int i = 0; i < listAdapter.getCount(); i++) { 
            View listItem = listAdapter.getView(i, null, listView); 
            listItem.measure(0, 0); 
            totalHeight += listItem.getMeasuredHeight(); 
        } 
        ViewGroup.LayoutParams params = listView.getLayoutParams(); 
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() – 1)); 
        ((MarginLayoutParams)params).setMargins(10, 10, 10, 10);
        listView.setLayoutParams(params); 
    还有子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
    


    61,使用代码为textview设置drawableLeft

    在xml中设置了 DrawableLeft、但我想在代码中实时改变drawable,有什么方法可以使用代码为textview设置drawableLeft呢? 
    方法一:
    public void  setCompoundDrawables  (Drawable left, Drawable top, Drawable right, Drawable bottom);
    1. Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
    2.   
    3. drawable.setBounds(00, drawable.getMinimumWidth(), drawable.getMinimumHeight());<span style="font-family: Tahoma;">//必须要setBounds,否则不会显示.</span>   
    4. tv.setCompoundDrawables(drawable,null,null,null);  
    Drawable drawable= getResources().getDrawable(R.drawable.drawable);
    
    drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());<span style="font-family: Tahoma;">//必须要setBounds,否则不会显示.</span>
    tv.setCompoundDrawables(drawable,null,null,null);

    方法二:
    public void setCompoundDrawablesWithIntrinsicBounds (Drawable left,Drawable top, Drawable right, Drawable bottom);

    android:drawableLeft和layout:weight同时使用时如何居中?

    android:drawableLeft设置的图片就是居左,但是注意,如果这个组件设置了layout:weight权重,那么图片无法和文字一起居中,文字属性可以通过android:gravity设置居中,想要android:drawableLeft设置的图片和文字一样居中,只能通过另外的方法来实现,因为drawableLeft的作用就是在组件左侧设置图片,如果你的组件宽度足够大,它照样一定会是在最左侧,否则居中的话,就不能是drawLeft了。


    62,Android强行关闭Activity(结束进程)的几个方法:
    一、结束一个活动Activity
      要主动的结束一个活动Activity,使用finish方法,而且这个方法最后会调用Activity的生命周期函数onDestroy方法,结束当前的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish系列方法,我们不在这里做详细讨论,有兴趣的同学可以自己查阅一下SDK 的文档。
    二、强制结束当前的进程
      强行结束当前进程有两个方法。
      1、killProcess(int pid)              例子:android.os.Process.killProcess(android.os.Process.myPid());
    这个方法使用是有条件的:
    a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;
    b、将被杀掉的进程 是由当前应用程序所创建的附加进程;
    c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)
      2、System.exit(int code)             例子:System.exit(0);
      该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。
      需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!
    三、结束另一个进程
      要通过一个进程去结束另一个进程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建议大家使用一个新的方法: 
      void killBackgroundProcesses(String packageName)
      由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。
    四、退出到主屏幕
      这个方法,也是退出当前进程的一个方法。如果我们在进程中创建了很多的Activity,但是又不想关闭时去退出不在任务栈顶的Activity,那么就可以直接使用这个方法了。

    63,通过adb命令获取Android手机的IP地址
     先执行命令"adb shell netcfg" 
    再执行命令 “adb shell ifconfig rmnet0”
    64,通过adb命令安卓apk到devices
    在cmd命令下,输入:
    adb devices  (用于显示当前所有连接的设备)
    adb install e:/test.apk (install后跟目标路径)
    adb shell rm data/app/test.apk  (卸载)
    在有多个设备(模拟器)时,需要制定设备号,adb devices 可以显示当前设备的序列号,在adb指令后加上参数-s<serialNumber> 比如 -s emulator-5554 ,就可以指定adb指令的目标
    65,通过adb shell命令打开指定应用程序
          $ adb shell
          $ am start -n {包(package)名}/{包名}.{活动(activity)名称} 
    1. adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity  
    adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity
    或简单点:
    1. adb shell am start -n breakan.test/breakan.test.TestActivity  
    adb shell am start -n breakan.test/breakan.test.TestActivity
    其中"breakan.test/breakan.test.TestActivity"中的"breakan.test"是程序的包名,"TestActivity"是程序Activity类的类名。
    比如:


    66,真机调试eclipse在file explorer中展不开data文件夹

    这个需要真机已经进行root过了,然后在手机上装上R.E 管理器(或类似软件),将/data/data的权限修改为可读可写可执行,然后,就可以在eclipse中展开了。


    67,如何把android textView字体大小固定写死,而不随系统设置字体大小的改变而改变?

    sp是字体的单位,dp一般是宽,高等的单位,但是不同的机器有不同的密度,hdpi,mdpi,ldpi,xhdpi,在这些密度下,以sp、dp为单位,那么最终都会转换成px单位下的值,所以,用px为单位就是固定值。


    68,EditText默认时不弹出软键盘的方法 

    方法一:

    在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden

       < activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="adjustUnspecified|stateHidden"
          android:configChanges="orientation|keyboardHidden">
      < intent-filter>
      < action android:name="android.intent.action.MAIN" />
      < category android:name="android.intent.category.LAUNCHER" />
      < /intent-filter>
      < /activity>

    方法二:

    让 EditText失去焦点,使用EditText的clearFocus方法

    例如:
            EditText edit=(EditText)findViewById(R.id.edit);
      edit.clearFocus();

    方法三:

    强制隐藏Android输入法窗口

        EditText edit=(EditText)findViewById(R.id.edit);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

    展开全文
  • 安卓知识点

    2017-12-28 15:00:48
    从字符串中获取指定下表的字符:abc.chartAt(0)的结果是a 获取控制台的输入信息:Scanner scanner=new Scanner(System.in); System.out.println(“姓名:”) String name=scanner.next()’ 获取系统时间:...
  • Android安卓知识点

    2014-10-10 16:33:00
    1 包名是唯一标识apk的记号,相当于公民身份证号。 2 ADB是Android Debug Brigde 的英文缩写,意思是Android程序调试桥,使用SDK自带的工具可以对Android模拟器或真机进行管理。 3 Android作为一个移动设备平台,...
  • 安卓知识点大全二

    2017-12-28 14:59:34
    1.这个方法是弹出一个Toast,信息一段时间后消失,不占用频幕空间 public void onClick(View v) { // TODO 自动生成的方法存根 Toast.makeText(MainActivity.this, “you clicked button 1”, Toast.LENGTH_...
  • 安卓知识点汇总-1

    2018-12-25 16:43:39
    关于java 子类继承泛型的问题; ` public abstract class Person
  • 本篇着重: 如何解码位图文件如何设置图片避免oom(多图模式),当然这里只有一张图片 1.封装工具类:BitmapTools和HttpUtils BitmapTools: ... // TODO Auto-generated constructor stu
  • 1发包的流程 Build->Generate Signed APK->选择Build Type(release/debug)->finished,打包完之后,生成的apk会在app目录下。 2ButterKnife的使用: (1) 首先在gradle中引用compile '... (2) @Bind(R.id.xx)Text
  • 15Android中常用的快捷键及调试 (1) ctrl+shift+n 查找某个文件 (2) 两次shift 查找某个文件(更细节) (3) Alt+enter 导入包或者实现某个方法 (4) Alt+r+r 重命名 (5) Crtl+d 复制当前行到下一行 ...
  • 这里自定义: CustomDialog public class CustomDialog { private AlertDialog.Builder builder; private Context context; public CustomDialog(Context context) { // TODO Auto-generated constructor ...
  • 本Blog 接上一篇:【安卓知识点汇总】拍照/访问系统相册小Demo 细节补充: 手机如何拍照上传到指定位置 直接上代码:首先定义http网络工具类:HttpPostUtils 这里需要用到: jar包下载地址...
  • 本Blog 接上一篇:【安卓知识点汇总】Bitmap位图解码 依然使用到自己封装好的两个工具类: HttpUtilsBitmapTools 这里就不赘述了,工具类详情见上篇。 这里定义bean类图片数据封装:便于调用 ...
  • 记录*A 1.解决Android应用被系统回收,重打开崩溃问题 http://blog.csdn.net/u011511577/article/details/54603256 注意FLAG_ACTIVITY_CLEAR_TASK http://www.jianshu.com/p/1946bd4f3bb5 当应用被杀死之后,...
  • 1.fragment 向activity带参跳转: (1)fragment中: Bundle: //进入要跳转页 Intent userIconIntent = new Intent(getActivit(),UserDetailsActivity.class); Bundle bundle = new Bundle();
  • 1.if语句空值代码是否执行。。只执行一次,
  • 安卓的响应机制,它是针对事件的处理状态来决定的。 出现了ANR •事件没有机会处理,被阻塞了 •事件正在处理,需要一定时间 如果需要业务需要,等待就得加上Loading,告诉用户当前需要等待。 当然为了很好的...
  • 自定义View篇:实现统计图 这里继承自View,重写onDraw方法: public class CountView extends View { private Paint myPaint;... private static final String title = "2006-2011上半年的销售情况";...
  • 系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的。下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法。 1.首先看看调用系统相机的核心方法: Intent camera = new Intent(MediaStore....
  • 官方HelloAnyChat的demo写的非常好,在这边作为初学者,可以学习到很多知识点
  • 安卓布局知识点

    2016-05-18 08:23:46
    Android四大组件  Activity Server (服务) BroadCastReceive(广播) ContentProvider(内容提供者) ---------------------------------------------------------------------------------------------
  • 安卓知识

    2013-07-22 23:06:00
    Android中对html进行分析 1.Android 中获取html源代码 public String getHtmlString(String urlString) {   try {   URL url = new URL(urlString);  ... URLConnection ucon = url.openConnection();... 
  • 安卓知识点

    2019-03-19 08:52:35
    自定义alertDialog 自定义alertDiaolog final AlertDialog alertDialog=new AlertDialog.Builder(activity).create(); alertDialog.show(); Window window = alertDialog.getWindow(); window.setContentView(R....

空空如也

1 2 3 4 5 ... 20
收藏数 1,597
精华内容 638
关键字:

安卓知识点