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,442)  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被激发的时间。

3月 302014
 

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

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

调试app

1月 062014
 

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

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

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

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

  相关文件及代码如下:

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

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

  Activity类的实现代码如下:

 

1月 012014
 

  1. 使用selector和图片设置Button的样式

  selector是一个设置view样式的集合,通过它可以对各种view的各种状态设置不同的样式。比如在此设置当按钮在正常或者按下状态或者获取焦点时的背景图片。话不多说,下面说说如何通过selector来实现。

  首先我们要准备几张图片,用以标示在按钮的不同状态。本人没有把全部状态的图片全部实现,只实现了正常、按下、获得焦点和不可用几个状态的,图片如下。用PS随便做的图片,显示效果可能不是太好,只是演示用。将几个图片拷到项目下的res->drawable目录中备用。

  有了图片后我们就可以写selector了,在项目->res->drawable上右键,选择菜单New->Other,在弹出的窗口中选择Android XML File,点击下一步,在Root Element列表中选择selector,File右边输入要创建文件的名字,我们这里就叫做graphic_button,点击完成按钮结束,这时我们就能在编辑器中看一个以<selector>节点为根节点的xml文件,现在我们可以为selector加item子节点了,下面把加好子节点的xml直接贴上来了。

  其中第一行,无任何状态的是正常状态下的背景图片

  • state_pressed是当按钮按下时,比如在屏幕上触摸该按钮时,要显示的背景图片。
  • state_focused是当按钮获得焦点时,按钮被高亮显示时,要显示的背景图片。
  • state_enabled其值为false是当按钮不可用时要显示的背景图片
  • state_selected当按钮是否为被选择状态时
  • state_checkable只有当按钮可以进行可选和不可选状态的切换时才会用到此状态
  • state_checked当按钮可选,并且按钮被选中或未选中时显示的背景图片
  • state_window_focused 是指当前所在的窗口是否有焦点时要显示的背景图片,比如弹出一个系统消息或者对话框时此窗口是没有焦点的。

  selector准备好了,我们可以设置按钮的背景样式了,不过先别急,为了更好的规划项目,我们还是为按钮创建一个样式来管理吧,打开项目->res->values->style.xml,在<resource>节点中加入如下xml片断

  好,现在我们可以来设置按钮的style属性了,打开部局文件,添加三个按钮,在每个按钮的Style属性中输入@style/GraphicButton,或者直接在部局的xml文件中加入该属性。XML片断如下

  运行程序,点点按钮我们就可以看到效果了。button的属性android:enabled=”false”,focused状态需要代码来实现,有时间的时候再完善一下本演示。

注意:

1. 一定要注意各个状态的顺序,见这篇文章

 

11月 072013
 

  假设我们有一个全局的数组对象,当我们点一下按钮时使数组当前索引加1,然后执行相应的操作,那么我们需要使用if语句来判断当前索引是否已经越界,如果越界则把当前索引置为0。如下所示

  那么不用if语句,我们也可以通过一个简单的运算来避免使用if语句,如下:

 

 Posted by on 2013-11-07

AlertDialog使用总结

 分类:Android, Java 阅读 (2,266)  No Responses »
5月 112013
 

  AlertDialog直接继承自Dialog类,可以用于显示确认提示框或者列表选择框,还可以用于显示有自定义布局的提示框,Android中内置的ProgressDialog、DatePickerDialog和TimePickerDialog都是继承自于该对象。

AlertDialog的创建

  AlertDialog的实例化函数是声明的protected的,所以不能直接通过new AlertDialog(context)来创建,而是要通过它的一个子类Builder来创建,AlertDialog的很多属性也是通过这个builder对象来实现的。

AlertDialog的区域

  AlertDialog从上到下共分3个区域,即标题区、内容区和控制按钮区。

  • 标题区用于显示提示框的标题,给用户简单提示此提示框是什么用途的。我们可以通过builder的setTitle方法来设置标题的内容。
  • 内容区可以放置详细的操作提示、信息提示或者选择列表,也可以使用自定义的Layout显示更为丰富的内容。
  • 按钮区用于放置操作按钮,最多可放置三个按钮,一个确定按钮,一个否定按钮,一个中性按钮,就如Windows程序中常见的“是、否和取消。我们可以通过setPositiveButton、setNegativeButton和setNeutralButton来设置三个按钮的显示内容和点击时的响应函数

在AlertDialog中显示一个选择列表

  AlertDialog.Builder提供了几种方法可以用于在内容区域显示一个可选择的列表框,这几种方法分别是setAdapter、setItems、setSingleChoiceItems、setMultiChoiceItems。

  • setItems(int itemsId, final OnClickListener listener)可以传入一个CharSequence数据或者一个数组资源R.array,但是此方法显示的列表的样式没办法改变,只能使用AlertDialog默认的样式,而且只能显示一列,数据只能是字符串类型。如果给后面的listener传入null值则点击列表的项目后窗口不会自动关闭。
  • setAdapter可以传入一个ListAdapter,开发者可以通过这个ListAdapter对象设计复杂的列表布局,以增加程序的可视化效果。
  • setSingleChoiceItems可以打开一个右侧带单选按钮的提示框,可接受CharSequence数组、资源数组、ListAdapter、Cursor对象,传入CharSequence数组、资源数组时右侧会显示一个单选按钮,传入ListAdapter时右侧无单选按钮,需要自己来实现单选按钮,Cursor未测试。当选择某项时,提示框不会自己关闭,而是要通过返回键或者下面的按钮来关闭提示框。
  • setMultiChoiceItems可以打开一个右侧带复选按钮的提示框,可接受CharSequence数组、资源数组、Cursor对象,不知道为什么没有支持ListAdapter。

AlertDialog中显示自定义部局

  当我们需要一个复杂的提示框的时候,我们可用自定义的Layout来填充到AlertDialog窗口中。这里主要用到的是Builder的setView方法。我们可以先用getLayoutInflater()或者getActivity().getLayoutInflater()来获取一个LayoutInflater对象,然后用View dlgV=inflater.inflate(R.layout.custom_dialog, null);得到一个View对象,然后再用setView方法将自定义部局填充到AlertDialog中。

  虽然我们可以在自定义部局中设计自己的标题和按钮,但我们仍然还可以使用setTitle和setPositiveButton等方法来使用AlertDialog中的标题栏和按钮。

  如果我们想将一个Activity转换成一个Dialog,并不需要再创建一个AlertDialog然后重新实现这些代码,只需要在AndroidManifest.xml中将Activity的Theme设置为Dialog样式的主题即可,如:

AlertDialog内容区域的优先级

  AlertDialog中详细提示信息和选择列表是不能同时显示的,几个方法的优先显示顺序为setMessage、setAdapter、setItems

Activity如何转换成Dialog

  当我们想把一个Activity转换成Dialog时,如果再建立一个AlertDialog或者DialogFragment来实现的话,很多代码都要进行修改,比如DialogFragment需要增加getActivity来实现对Activity的一些方法进行访问,也不支持设计时设置的android:onclick属性,需要在java代码中用setOnClickListener来执行单击事件,这样做起来相当的麻烦。

  那么比较简单的方法就是通过在AndroidManifest.xml中给该Activity设置一个Dialog使用的Theme来进行支持,这样做的缺点是如果使用的不是android的主题则需要自己写一个符合程序的主题。

 如何设置AlertDialog的样式

  我们需要先定义一个样式,在res/values/style.xml中定义一个MyAlertDialog的样式(此方法暂时不可用,设置效果总不是想要的效果,再研究后再发布过来)

  在代码中,创建builder的时候传入这个样式名称,如下:

点击此处下载AlertDialogTest代码