[Android排错]Circular dependencies cannot exist in RelativeLayout

03-30 14:19:26.690: E/AndroidRuntime(8437): java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout 在相对布局中不能存在循环依赖! 比如先A在B的下边,就不能定义B在A上下左右。。。 而源码中也提到了另外一种循环依赖: RelativeLayout layout_height设置为wrap_content,然后设置子viewlayout_alignParentBottom=“true”。 RelativeLayout高依赖于子View,而子View又声称在RelativeLayout的底部。 /** * * Note that you cannot have a circular dependency between the size of the RelativeLayout and the * position of its children. For example, you cannot have a RelativeLayout whose height is set to * {@link android.view.ViewGroup.LayoutParams# WRAP_CONTENT WRAP_CONTENT} and a child set to * {@link# ALIGN_PARENT_BOTTOM}. * */ 但是这种情况不会出现异常,实际上相当于设置fill_parent的效果。

三月 31, 2012

Android Theme and styles

Android 使用Theme and styles,简化开发,提高开发效率 Theme就像系统主题,可以定义一套完整的"style"。 系统已经预定义了很多Theme,你也可以定义自己的Theme。 例如:系统默认的是黑色背景,白色字体,当然还有别的属性。 单个Activity或者整个应用设置主题使用: android:theme="@android:style/Theme.Light" 即可设置背景为白色,字体黑色。 使用style可以针对某个视图指定样式。

三月 28, 2012

完美实现同时分享图片和文字(Intent.ACTION_SEND)

使用以下代码可以很好的完成同时分享图片和文字的功能: private void share(String content, Uri uri){ Intent shareIntent = new Intent(Intent.ACTION_SEND); if(uri!=null){ shareIntent.putExtra(Intent.EXTRA_STREAM, uri); shareIntent.setType("image/*"); //当用户选择短信时使用sms_body取得文字 shareIntent.putExtra("sms_body", content); }else{ shareIntent.setType("text/plain"); } shareIntent.putExtra(Intent.EXTRA_TEXT, content); //自定义选择框的标题 //startActivity(Intent.createChooser(shareIntent, "邀请好友")); //系统默认标题 startActivity(shareIntent); }

二月 6, 2012

[Andorid]ScrollView嵌套GridView和ListView

以下内容核心思想来自网络,未找到文章原始地址。 GridView和ListView都自带滚动效果,但是开发中经常有这样那样的需求要求ScrollView嵌套GridView和ListView。比如: GridView需要显示“headerView”,即一个View要跟随GridView一起滚动;一个界面中有多个GridView或者ListView,或者混排,同时还要显示其他View。 解决办法:自定义一个GridView控件 public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 该自定义控件只是重写了GridView的onMeasure方法,使GridView刚好足够大“放下”所有内容,从而使其不会出现滚动条,ScrollView嵌套ListView也是同样的道理。 布局文件中使用时将自定义的GridView控件插入到中间的LinearLayout中 <ScrollView> <LinearLayout> </LinearLayout> </ScrollView> PS:调试程序,很多时候看到的log,表现都是表象,掩盖了问题的本质。需要深入思考,直捣问题本质。

一月 31, 2012

[自动化]SVN 日志模板--svn checkin log template

# !/bin/sh # # SVN_EDITOR script # [ $# -eq 1 ] || { echo "usage: $0 file" exit 1 } file=$1 ed=$VISUAL [ -z $ed ] && ed=$EDITOR [ -z $ed ] && ed=vi cat <$file.$ Feature : BugID : Author : Reviewer : Description : Changed List : ENDTEMPLATE cat $file >>$file.$ sum=`cksum $file.$` if $ed $file.$; then newsum=`cksum $file.$` if [ "$newsum" != "$sum" ]; then rm -f $file mv $file....

九月 2, 2011

Android源码开发中单个模块的编译自动化

# !/bin/sh . build/envsetup.sh lunch 1 case $1 in "pc") mmm packages/apps/Contacts/ find out -name Contacts.apk |xargs -t -i adb push {} system/app/ ;; "pp") mmm packages/providers/ContactsProvider find out -name ContactsProvider.apk |xargs -t -i adb push {} system/app/ ;; "ph") mmm packages/apps/Phone/ find out -name Phone.apk |xargs -t -i adb push {} system/app/ ;; "pf") mmm frameworks/base find out -name framework.jar |xargs -t -i adb push {} system/framework/ ;; "pm") mmm packages/apps/Mms/ find out -name Mms....

九月 2, 2011

Android对数据库表的一个约定:每张表都应该至少有_id这列

Android对数据库表有一个约定。就是每张表都应该至少有_id这列。ListView在使用CursorAdapter及其子类适配 cursor的时候,会默认的获取 _id 这列的值,如果你建的表没有 _id这列或者你的cursor中没有_id这列(查询时的projection中没有_id)就报错了。所以使用CursorAdapter及其子类的时候一定要使查询时的projection包含_id。CursorAdapter中相关代码如下: 1.注释 /** * Adapter that exposes data from a {@link android.database.Cursor Cursor} to a * {@link android.widget.ListView ListView} widget. The Cursor must include * a column named "_id" or this class will not work. */ 2.构造方法 public CursorAdapter(Context context, Cursor c) { init(context, c, true); } public CursorAdapter(Context context, Cursor c, boolean autoRequery) { init(context, c, autoRequery); } protected void init(Context context, Cursor c, boolean autoRequery) { boolean cursorPresent = c !...

八月 24, 2011

shell脚本打开IE快捷方式url文件

[InternetShortcut] URL=http://www.baidu.com/ IDList= BEST=0 [{000214A0-0000-0000-C000-000000000046}] Prop3=19,2 以上是windows下保存的百度的快捷方式文件以文本形式打开的代码。所有url文件的格式基本一致,前2行相同,后面的略有不同,没有研究。 现在的任务就是取得网址,然后用浏览器打开。shell脚本读取文件的指定行可以用以下方法: cat $1 | awk ‘NR==2’ 或者 sed -n 2p $1 其中$1表示你输入的文件名,想读去第几行就用几代替2即可。所以打开url文件的脚本如下: cat $1 | awk ‘NR==2’ |sed ’s/URL=/ /g’ |xargs firefox sed -n 2p $1 |sed ’s/URL=/ /g’ |xargs firefox 读取第二行,然后用空格替换URL=,最后用firefox启动。即相当于是执行了 firefox http://www.baidu.com/ 将以上脚本保存为openurl.sh,并赋予运行权限。此时可以在命令行下使用以下命令打开url文件 ./openurl baidu.url 这样还是不方便,继续。在url文件上点击右键,选择使用其他应用程序打开, 选择使用自定义命令,然后点击浏览定位到我们的shell脚本文件openurl.sh,注意,选中下边的记住打开。。。这样以后只要双击url文件就会出现以下对话框,选择显示即可在浏览器中打开这个url文件。 但是后来经过测试,有些url文件打开无效。目前还不清楚原因,可能和网址或者url文件代码中第二行以后的代码有关。

八月 13, 2011

Ubuntu快捷键

Win+E - 显示所有桌面,方便的左右选择。需要鼠标点击选中,再按 Win+E 切换,所以不是很实用 Alt+Ctrl+Left/Right Arrow -切换桌面 Alt+Ctrl+Shift+Left/Right Arrow - 移动当前窗口到其他桌面 Alt + Enter 显示文件属性窗口 Alt+F9/F10 - 最小化/最大化当前窗口 Alt+F5 -不最大化当前窗口 Alt+F7 - 激活当前窗口的移动选项,你可以使用方向键移动当前窗口,甚至移动到其他桌面。 Alt+F8 - 用方向键调整当前窗口大小 Shift+Ctrl+N - 新建文件夹, 很有用 Ctrl + 1/2 - 改变文件夹视图查看方式,图标视图/列表视图 Ctrl + W - 关闭当前窗口 Ctrl + Shift + W - 关闭所有窗口(这2条只关闭窗口,不关闭应用程序) Ctrl+T - 在Nautilus中新建一个标签(Nautilus 就是 Ubuntu 下的资源管理器) Alt + Up/Down Arrow - 移动到父文件夹/选择的文件夹 Alt + Left/Right Arrow - 后退/前进 Alt + Home -跳转到主目录 F9 - 开关显示Nautilus侧边栏 Alt + F1 - 打开应用程序菜单 Alt + F2 - 打开运行应用程序对话框 Win + 鼠标滚轮 - 放大/缩小屏幕 FireFox中 Alt + Home 打开主页,Ctrl+Shift+T打开之前关闭的页面

八月 12, 2011

[自动化]一次向svn中增加所有新增文件

以下摘自:《卓有成效的程序员》之自动化 我经常会一次往Subversion里添加一批文件。在使用命令行做这件事时,你必须指定所有想要添加的文件名。如果文件不多的话这还不算太糟糕,但如果你要添加20个文件,那就费事了。当然你也可以用通配符,但这样一来就可能匹配到已经在版本控制之下的文件(这不会有什么损害,只不过会输出一堆错误信息,可能会跟别的错误信息混淆)。为了解决这个问题,我写了一行简单的bash命令: svn st | grep '^\?' | tr '^\?' ' ' | sed 's/[ ]*//' | sed 's/[ ]/\\ /g' | xargs svn add 表4.3详细解释了这一行命令。 我大概花了15分钟写出这条命令,然后用了它成百上千次。 然后我在一个博客中看到这样一个脚本: svn st|awk '{print $2}'|xargs svn add 乍看之下觉得更加精炼,仔细看下就会发现这个脚本没有区分文件状态。所以完善了以下这个脚本: svn st | awk '{if ( $1 == "?") { print $2}}' | xargs svn add 这样,以后我可能使用这个脚本成百上千次。(当然这个脚本也没有考虑过滤掉不要添加的文件) 当你第三次做一件事情的时候,就应该考虑将其工具化,自动化! 推荐图书:卓有成效的程序员

八月 11, 2011