1.我想实现一个EditText点击后出现DatePickerDialog然后返回值到EditText显示。
做完之后发现点击EditText只是触发焦点或者弹出软键盘(我把软键盘禁用之后就只触发焦点)
然后在获得焦点之后再次点击才会出现DatePickerDialog...
方法一:这个是在View里定义onTouchEvent()的默认处理逻辑。假如一个View是可以获得焦点的话,那么第一次点击操作就是获取焦点。这里有源代码:
boolean focusTaken = false;
if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
focusTaken = requestFocus();
}
if (!mHasPerformedLongPress) {
// This is a tap, so remove the longpress check
removeLongPressCallback();
// Only perform take click actions if we were in the pressed state
if (!focusTaken) {
// Use a Runnable and post this rather than calling
// performClick directly. This lets other visual state
// of the view update before click actions start.
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
if (!post(mPerformClick)) {
performClick();
}
}
}
所以如果你想改变这个的话,只能自己重新实现一个onTouchEvent()而不调用super.onTouchEvent(),注意参考源代码。
方法二:设置edittext不能获取到焦点.就OK了,即在TextView中加入android:focusable="false"
2.一个textView点击后跳转到另一个页面。
刚开始此textView没有跑马灯效果,布局如下:
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25px" />
后来觉得加上跑马灯效果更好点,故布局如下:
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textSize="25px" />
但问题出现了,用上面的布局,点击之后会进行页面的跳转,用下面的布局,跑马灯效果是有了,但点击textView后不进行页面的跳转。
那么我应该如何实现了?求解答。
方法:删除android:focusable="true",原理:android:focusable="true" ,这样当你点击时其实是点击的是textView,从而textView获取焦点而不是listView中的某一列获取焦点,当然也就不会触发onListItemClick方法,这样当然也就不会进行页面的跳转了。解决方法是:删去这个属性,就OK了!
3.201200920 -----今天又遇到个问题。android手机联互联网问题!如何判断手机是否连接互联网?本来以为很简单,以为直接调用下面的方法就可以了
/**
* 检查网络连接情况
*
* @return 0: None, 1: Wifi, 2: GPRS, 3: Other
*/
protected static int checkNetworkType(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// 获取代表联网状态的NetWorkInfo对象
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
// 获取当前的网络连接是否可用
if (networkInfo == null || !networkInfo.isAvailable())
return 0;
// Wifi
State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
.getState();
if (State.CONNECTED == state) {
return 1;
}
// GPRS
state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
.getState();
if (State.CONNECTED == state) {
return 2;
}
return 3;
}
其实不然,我发现当手机关闭GPRS,然后连接公司的wifi,通知栏显示wifi已经连接上,并且这个方法返回值为1,我就默认为此时我们的手机已经联网了,但实际发现此时手机还是打不开网页,对应到项目中来就是我们不能从服务器获取信息。
后来想想可能是因为我们连接了wifi,但此时公司路由器并没有连外网,所以还是打不开网页,也获取不了服务器信息。怎么解决判断手机是否连接外网暂时还没有想到,继续研究....
4.20120921项目交给测试部门测试(其实自己也觉得有很多bug)
今天遇到的问题:项目在A手机上能够后运行,B手机上也能够运行,但在C手机上就运行不起来。出现:Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY的错误。在网上一查,大部分的人都说是我建工程的时候target没有选google map的target,但奇怪的是我建的项目就是google map的target。后来看到一篇文章,试着解决,终于解决了。链接:http://www.cnblogs.com/jrvin/archive/2011/05/24/2055718.html
其中遇到过Read-only file system问题,但这都是些小问题,最后还是解决了!
5.20120922项目测试又出现了一个问题,关于camera问题。拍完照传到服务器相片是逆时针旋转90度的。目前没有解决。。。努力中!
当有一个活动A设置启动模式为singleTask模式时。
又有多个其他活动需 经过Intent 跳转到活动A,并附带信息。 那么肯定会设置action!
当活动A 判定是哪一个活动过来的时候。
当活动A没被系统杀了。活动A的oncreate 将不执行,先执行onNewIntent,再onResume!
所以在onNewIntent里面 可
@Override public void onNewIntent(Intent arg0) { // TODO Auto-generated method stub super.onNewIntent(arg0); System.out.println("OnNewIntent进来了"); setIntent(arg0); intent = this.getIntent(); }
关键是 setintent(arg0);
只有设置了这个 才会更新 intent。(action)
否则一直是第一个跳转到活动A的那个intent的action
假如写这样的一段代码:
int i; { int j=1; i=j; }
如果这段代码是存在于类定义区域,那么我们知道它是个普通的语句块,用于初始化类属性的内容,它会在类实例化的时候被调用,里面可以执行一些方法。
在很多实例里,它会用于单例等模式,之前加上一个static,来为复杂的类初始化内容,可以避免一些由于加载顺序引起的运行期异常。
但是,如果这段代码出现在方法里呢?
它基本一点意义都没有。在我自己从前的想法里,它就是个把代码括起来的格式,没有其他。
今天写了一点和“语句标签”相关的代码:
label17: int i; int j; ThreadGroup[] arrayOfThreadGroup; if (flag) break label17; return 0;
在“:”位置出现了异常“Syntax error on token ":", { expected after this token”。
即是说,当代码无法单行存在的时候(int i在方法体内部必须有明确的实例化\赋值位置),label17需要用语句块标明。
正确的格式是:
label17: { int i; int j; ThreadGroup[] arrayOfThreadGroup; if (flag) break label17; return 0; }
或者:
label17: int i; int j; ThreadGroup[] arrayOfThreadGroup; if (flag){ break label17; return 0;}
再来看个错误的用法:
label13: int x = 0;
很明显,在标签后有个默认的单行语句块,这个x在以后的任何位置都无法被使用到,错误。提示如下:
Multiple markers at this line
- x cannot be resolved to a variable
- Syntax error on token "int", delete this token
正确的格式有两种:
int x = 0; label13: x = 0; 或者 label13:{ int x = 0;}
于是推想,以前的一个思维误区,for(){},if(){}之类的用法中,逻辑if()和语句块{}应该是相互独立的两种语法。
基础没学好的后果!