11月 142014
 

  做了一个小的app,其中用到了tab形式的actionBar和多个fragment,后来因为需求需要在某两个fragment中加入context menu,加入后添加onContextItemSelected事件响应菜单按下的效果,一开始运行正常,在两个fragment中打开context menu正常,两个fragment中的菜单响应事件也正常,后来改动了一些代码后突然发现菜单响应的不正确了,只有一个fragment中的菜单有响应,另外一个没响应。经过一番修改后,发现是onContextItemSelected的返回值影响到了菜单点击事件的执行。

  我们先来看一下onContextItemSelected的官方描述:

  我们主要看这个返回值部分,返回为了一布尔型变量,当返回false值时由系统去决定此菜单事件的响应流程,返回true则表示菜单响应到此为止,停止后面的流程。

  本人没做深入研究,猜想大概流程是这样的,因为在fragment中调用context menu中通过如下方式

  是通过父activity来填充这个弹出菜单,所以首先是父activity先接收到onContextItemSelected事件,如果父activity中不做处理,则activity会把这个事件分发到各个fragment中去,本人在此次犯的错误就是在子fragment中的onContextItemSelected事件中返回了true值,所以只在一个fragment中响应了事件,另外一个没有响应。

  既然在所有的fragment中都会响应onContextItemSelected这个事件,那么我们在每个fragment中处理该事件的时候就需要做一些判断,以避免多个fragment同时执行这个事件,这个是非常重要的,因为不做判断很可能出现一些莫名奇妙的而且不好测试的问题。如下例子:

 

11月 012014
 

  ContextMenu相当于windows中的右键弹出菜单,在android中一般要长按某个view才会激活这个弹出菜单,但是有些情况下我们想单击就可以打开这个菜单,以提高用户的使用体验。那么如何才能单击就能打开这个菜单呢,其实很简单,我们在view的onClick事件中调用openContextMenu()即可打开这个弹出菜单了。下面是一个代码片断:

  imgcapture是一个ImageView,此代码执行后,单击imgcapture即可触发onCreateContextMenu事件,然后弹出菜单。另外,必须要调用registerForContextMenu注册这个菜单,否则单击和长按都无法弹出这个菜单。

  如果要弹出比较复杂的菜单的话就用使用Dialog来实现了。

10月 292014
 

  对于获取数据库中的记录数量的方法,其实应该是很简单的问题,之所以发文把此方法写出来,是因为有一些需要地方需要注意,避免其他人再在此问题上浪费时间。

方法一:

  这是一个很普通的方法,通过sql语句获取数量并赋给一个sql别名字段,然后通过这个别名来获取记录的数量,但是需要注意的是必须要有cursor.moveToFirst(),这个函数,因为rawQuery执行完成后返回的Cursor不是定位到第一条记录的,而是定位到第一条记录之前,所以必须要moveToFirst让记录定位一下才能读取数据,同样地获取其他的数据的时候也要在其之前调用此函数。

  如果是读取多条记录的时候我们一般会用

方法二:

  此方法需要注意的是,sql语句select的时候最好不要select *这样会把所有字段的数据都读出来,浪费内存,效率低。

10月 102014
 

  从网上看到的代码,在项目的src目录下新建一个widget的package,然后新建一个VerticalSeekbar的类然后把下面的代码复制到里面。在layout设计界面左侧的组件列表的自定义组件中刷新一下即可看到这个组件了。

 

MotionEvent详解

 分类:Android, Java 阅读 (1,143)  No Responses »
10月 092014
 

MotionEvent用来向界面发送鼠标\手写笔\手指或者轨迹球的事件,一般包括硬件的动作类型及一些坐标轴信息。

getPointerCount()
有几个点同时触发了此事件,用于多点触控。

final float getPressure()
第一个触点的压力值(也有可能是任意某个触点)
final float getPressure(int pointerIndex)
返回指定的pointerIndex触点的当前压力值(使用getPointerId(int)来获取此触点的pointerIndex值)

final float getRawX()
Returns the original raw X coordinate of this event.

final float getRawY()
Returns the original raw Y coordinate of this event.

final float getSize(int pointerIndex)
得到触点触摸屏幕的面积值,此值的意义是个相对值,具体计算方法不清楚。(使用getPointerId(int)来获取此触点的pointerIndex值).
final float getSize()
getSize(int) for the first pointer index (may be an arbitrary pointer identifier).

getDownTime()
返回当屏幕刚被按下时的时间(毫秒),按下后移动此时间不变。

final long getEventTime()
返回MotionEvent所在的事件被激发的时间(毫秒),如在OnTouchListener(MotionEvent event)中,每个OnTouch被激发的时间。

7月 242014
 

  很久没用Eclipse了,今天打开的时候,突然报Android开发插件需要更新。打开插件管理页面,更新Android插件,又提示和旧版本有冲突,心想只能卸载了重新安装了。找了半天没找到在哪下载,把Eclipse目录下的plugins目录下和android相关的都删除了,还是不能更新,后来又把features目录下和android中的jar包都删除了,还是不行。经过在网上一番搜索,终于找到在哪卸载了,对Eclipse的友好性真是……

  下面说一下详细的步骤吧

  1. 打开菜单help->Install New Software…

  2. 点击窗口中正文选项里的蓝色already installed标签

  3. 选中要卸载的插件,然后点击Uninstall按钮(里面除了Eclipse IDE for Java EE Development外都是Android for Eclipse的插件)

  4. 这时会弹出一个确认窗口,点击Finish按钮,Eclipse就开始删除插件了,删除完成后会弹出一个提示窗口提示是否要重新启动Eclipse

3月 302014
 

先在要调试的代码前边的灰色条上点一下,当代码这行变成红色背景时说明断点已经打上了
然后在上面的工具栏中点击绿三角右边的那个带刺的e按钮,这个按钮是以调试模式运行应用
这样就可以了,当代码运行到你设置的断点的时候,就会暂停,这时你就可以开始调试你的代码了

A220C055-FCAE-4FFB-812F-41932236B419

调试app

Java的一些问题总结

 分类:Java 阅读 (580)  No Responses »
3月 162014
 

1. 整型数据类型中,需要内存空间最少的是(D)

A) short                B) long                 C) int                    D) byte

关于这个问题,我认为byte应该是字节型,就不算整型,怎么能选D呢。

2. Java中的default关键字 default关键字是Java8 的新特性,其作用是使用此关键字可以在接口中给接口函数增加默认的实现内容,以方便接口增加新的接口函数后继承自该接口的类也可以编译通过。如下代码:

3. Java中的native关键字 native用于定义本地方法,即方法的定义是在java中定义,但是其实现是用非java语言实现的

4. Java中的多态性——重载,重载函数不能同时有完全相同的参数(即参数数量和参数数据类型都一致),参数的数量可以与原来的不同,返回值也可以与原来的不同。

5. 子类覆盖父类方法时(注意:是覆盖不是重载),方法的作用域不能低于父类方法的作用域,比如父类用public声明的,子类中就不可以用private或者default声明,另附几个作用域关键字对应的作用范围

   类内部  本包  子类 外部包 
public         
protected        ×
default       ×  ×
 private    ×  ×  ×

6. 一个.java文件中,可以有多个类,但是只能有一个使用public定义的类

7. throw是在一个过程中抛出具体的某个异常(异常类的实例);throws是定义在方法头的可能会抛出的异常,可以同时定义多个异常类。

8. 参与运算时,数据类型会从低精度的数据类型向高精度自动转换

改变一下:

9. Java中基本数据类型包括byte、int、char、long、float、double、boolean和short

引用数据类型包括:类,数组,接口等(简单来说就是除了基本数据类型之外的所有类型),所以String也是引用类型的

10. Java中抽象类可以有实现方法,但是抽象类不能实例化,所以也无法调用实现方法,其他抽象类的特点

a. 抽象方法 abstract void f(); 抽象方法不能包含有任何方法的BODY 。
b. 如果一个类包含1个或者多个抽象方法, 则该类必须限定为抽象的。
需要在前面指定 abstract 关键字。
(1)抽象类不能被实例化
(2)包含抽象方法的类,必须标识 abstract
c. 如果从一个抽象类继承, 必须对所有抽象方法进行覆盖 , 否则导出类也是抽象的
d. 也可以考虑创建没有任何抽象方法的抽象类 。

11. 如果子类中没有显式调用父类的某个形式的构造函数,子类的构造函数会自动调用父类的无参数的构造函数,不管何种情况基类的无参构造函数肯定会被调用。

 Posted by on 2014-03-16
1月 062014
 

  在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的。但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量是可变的,我们可通过获取屏幕宽度并除以项目宽度来处理。请看下面的代码:

  但是由于不同的Android设备可能有不同的宽度,项目宽度乘以获得的列数所得到的总宽度并不能填充整个屏幕的宽度,而给用户带来不好的用户体验,甚至我们可能还需要使行高和列宽保持一定的比例,那么如何动态调整项目的宽度和高度呢?

  我们此处是通过写一个自己的Adapter类,并改写其中的getView函数来实现的,getView是用来返回某个GridView项的部局的函数,我们在此处手动生成需要的view并设置此view的宽度和高度,最后将此view返回。

  注:使用此方法时,项目中的内容可能也需要手动去填充,请再研究

  相关文件及代码如下:

  主窗体只有一个GridView,部局文件代码:

  GridView项所使用的部局文件只有一个TextView,命名为note_item,代码如下:

  Activity类的实现代码如下: