android开发中碰到的问题总结(保持更新)
2015-11-12 19:15
615 查看
1、使用xmlPull解析xml数据得不到数据?但是解析方法是正确的
首先检查自己的解析方法是否正确,如果没错的重点查找xml数据的“格式”是否正确!!
比如上图,大家能看出传递过来的xml数据哪里不对。其实是这里<!--姓名 ->注释的格式不对,正确的应该是<!--姓名 -->,大家可以比较下看,后者比前者多了一个横线。如果数据格式是前者,即使解析方法正确,也得不到正确的值。
虽然这种机会很少碰到,但是今天就遇到了,刚开始还以为自己的解析方法不对,查找了一个下午才找到。
同时,如果解析的是字符串。可以用ByteArrayInputStream(str.getBytes)转为一个InputStream。
2、SVN提交错误:working copy is not up-to-date解决方法
svn在提交时报错如下图:
working copy is not up-to-date
svn:commit failed(details follow):
svn:file "xxxxx is out of date"
item is out of date
svn:item "xxxx" is out of date
解决方法:
在相应文件上,单击选择team,然后选择先更新,然后再提交。这样就好了
3、
如果你自定义spinner,那这个当然不是问题;也可以在原有的选项列表中开头增加一项空字符串项,默认显示这个空字符串也达到了效果,不过采用这种方式需要你在获取被选择项的位置时忽略空字符串项。
经过一番摸索,发现我们只要保证 spinner第一次展示时不显示即可,相关代码如下:
4、安卓文本中一些特殊的文本输入,需要使用ASCII码
/article/2015374.html
5、文本颜色的字体选择器,注意不是用drawable了,而是使用color,(虽然drawable可以用颜色表示)
下面这个是字体颜色的选择器
下面这个是按钮的背景选择器
6、
今天无意中碰见了 case expressions must be constant expressions 的问题
写了一个
[java] view
plaincopy
switch (v.getId()) {
case R.id.ivTitleBtnRightImage:
LuTaiService xxService = mFragmentCallBack.getService();
if (xxService == null || !xxService.isAuthenticated()) {
return;
}
new AddRosterItemDialog(mFragmentCallBack.getMainActivity(),
xxService).show();// 添加联系人
break;
default:
break;
}
导入到其它的工程里面 case R.id.ivTitleBtnRightImage : 出现了错误
错误提示为:case expressions must be constant expressions
网上查了一下 发现是 我的工程 勾选了isLibrary 的原因,将 勾选 去掉 再clear一下 就好
7、调用webService出现
正常情况下,android使用google的ksoap2这个包,就可以正常调用webService,前提条件是,服务端回传的必须是xml数据。
出现这个异常,原因是服务端回传的不是xml数据,而是如下图所示
可以看到,回传的数据不是传统的xml数据,当ksoap2解析服务端数据,发现不是xml数据就报错了
这个时候,就不能用ksoa2去调用webService了,必须使用传统的http协议,发送post请求,代码如下
8、TabHost组件,添加TabWidget时,默认是有分割线的,可以在xml进行控制。
9、出现java.net.SocketException: socket failed: EACCES (Permission denied)
是没有添加权限,到主配置文件加上相应权限即可
10、fragmentTabHost之间 用bundle传值
11、ViewUtil.inject()要放在setContenView()之下,否则出现空指针异常
12、一个float 保留2位小数,转成字符串
13、PullToRefresh
在初始化完成PullToRefreshListView后,通过lv.getLoadingLayoutProxy()可得到一个ILoadingLayout对象,这个对象可设置各种指示器中的样式、文本等。
[java] view
plaincopy
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy();
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
默认是上拉和下拉的字同时改变的,如果希望单独改变呢:
[java] view
plaincopy
private void initIndicator(){
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(
false, true);
endLabels.setPullLabel("你可劲拉,拉2...");// 刚下拉时,显示的提示
endLabels.setRefreshingLabel("好嘞,正在刷新2...");// 刷新时
endLabels.setReleaseLabel("你敢放,我就敢刷新2...");// 下来达到一定距离时,显示的提示
参考http://blog.csdn.net/mwj_88/article/details/39185921/
/article/8230233.html
https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1215/2166.html
补充,这个控件有headView,所以索引是从1开始的,0为head
在listView的setOnItemClickListener最后写上面的代码
或者 listData.get(position-1)
否则出现指针越界异常
参考
http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html
http://blog.csdn.net/sbvfhp/article/details/44959917
14、Android showDialog时报错requestFeature()
must be called before adding content
01-08 10:06:54.670: E/AndroidRuntime(1968): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:192)
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.internal.app.AlertController.installContent(AlertController.java:234)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.AlertDialog.onCreate(AlertDialog.java:314)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.Dialog.dispatchOnCreate(Dialog.java:335)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.Dialog.show(Dialog.java:248)
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.test.showDialog(MainActivity.java:121)
出现此问题是由于dialog.show()之前调用了dialog.setContentView()或者dialog.getwindow()等,正确的应该是dialog.show()之后调用dialog.setContentView()
参考
/article/8241412.html
15、xutil的一些参考文档
http://www.tuicool.com/articles/MVNzUnI
Xutils3的使用
http://www.w2bc.com/Article/84851
xutil的多文件上传填写
16、android给listview的item设定高度失败
/article/2813039.html
http://bbs.anzhuo.cn/thread-982250-1-1.html
17、
http://www.pm-road.com/index.php/2014/10/16/118/
18 java去除字符中的HTML标记
http://shenyuc629.iteye.com/blog/1876378
19、常用的2个shape 和selector
下面这个是空心有边框的shape
下面是一个正常情况透明,点击变色的selector
20、
21、在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果?
http://www.2cto.com/kf/201312/268110.html
//一个得到屏幕高度的工具类
22、常用的技巧
一、标题栏的隐藏
方法1、
在Activity的oncreate方法中添加requestWindow()方法,需要注意的是它必须放在setsetContentView()方法之前,否则会报错。
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
……}
方法2、
在配置文件Xml中设置Acitivity的theme属性
[java] view
plain copy
<activity
android:theme="@android:style/Theme.NoTitleBar"
android:name=".Test" >
……
</activity>
二、状态栏的隐藏
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
……}
在Activity的oncreate方法中添加requestWindow()方法,在setsetContentView()方法之前之后都可以。
三、全屏的实现
方法1、
在Activity的oncreate方法中设置
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
……}
方法2、
在配置文件Xml中设置Acitivity的theme属性
[java] view
plain copy
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".Test" >
……
</activity>
注意:
以上三点只针对某一个Acitivity窗口进行设置,若想针对应用程序所有的Activity,那么直接在配置文件里进行设置,如
[java] view
plain copy
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
那么所有Activity都会隐藏标题栏和状态栏,全屏显示。
23、unable to find attribute android:preserveIconSpacing 这个错误如何解决?
http://www.imooc.com/qadetail/89022
点击V7包找到values文件夹 ,打开attrs.xml , ctrl+f 查找 MenuView , 将preserveIconSpacing注释掉或者删掉
, clean项目
24、Android PullToRefresh (ListView GridView
下拉刷新) 使用详解
/article/7811504.html
25、Google自己的下拉刷新组件SwipeRefreshLayout
谷歌官方的swiperefreshlayout圆圈式下拉刷新,因为加了两个新的v4和v7兼容包,所以才有圆圈的效果,如果没有新的v4和v7兼容包,就是旧的彩线的效果.这里仅提供新的圆圈式效果。
如果想用圆圈的样式,需要去Android sdk manager里把Android support library升级到最新23版,如果是19版样式仍然是横线
26 SwipeMenuListView 需要引入一个外部库,代码
27、点击查看大图代码 ,见youzi 的PositionDetailActivity
28、
现在有一种需求,一个按钮的背景要显示3种颜色
1、enable模式
2 disables模式
3、点击press模式
4、不可press模式就是enable模式,默认都是为true
多用在短信验证码的按钮上
29、一个会犯错的布局,
如果一个Relative布局里面还有RelativeLayou,这个布局有点击事件,需要在里面的RelativeLayout布局里写clickable=true事件
30、压缩图片的2个笔记
1个是通过bitmap来压缩,适合通过startAcitivityForResult变形图片后,得到bitmap,上传到后台
1个是通过file来压缩,适合选择图片通过uri得到file上传到后台,要压缩来节省流量
http://www.360doc.com/content/14/0428/17/11800748_372972179.shtml
http://104zz.iteye.com/blog/1694762
31、一些android的小知识点
http://www.tuicool.com/articles/juqIN3J
32、如何去掉ListView底部的ListDivider
/article/7970787.html
所以,如果ListView的高度是fill_parent,那么当Item很少,而没有能填满ListView的高度的时候,底部就会出现分割线。反之,如果ListView的高度是wrap_content,那么ListView的高度就是随着Item的增多而变高的,最后一行的Item始终是达到了ListView的底部,也就不会出现分割线了。
33、
让自己的聊天界面ListView实现向众多聊天软件那样从底部开始,其实很简单,只需要在实例化的ListView设置setStackFromBottom(true);即可实现刚刚开始的信息是显示在底部的~~
首先检查自己的解析方法是否正确,如果没错的重点查找xml数据的“格式”是否正确!!
比如上图,大家能看出传递过来的xml数据哪里不对。其实是这里<!--姓名 ->注释的格式不对,正确的应该是<!--姓名 -->,大家可以比较下看,后者比前者多了一个横线。如果数据格式是前者,即使解析方法正确,也得不到正确的值。
虽然这种机会很少碰到,但是今天就遇到了,刚开始还以为自己的解析方法不对,查找了一个下午才找到。
同时,如果解析的是字符串。可以用ByteArrayInputStream(str.getBytes)转为一个InputStream。
2、SVN提交错误:working copy is not up-to-date解决方法
svn在提交时报错如下图:
working copy is not up-to-date
svn:commit failed(details follow):
svn:file "xxxxx is out of date"
item is out of date
svn:item "xxxx" is out of date
解决方法:
在相应文件上,单击选择team,然后选择先更新,然后再提交。这样就好了
3、
android Spinner默认不选中项目开发中经常有些变态的需求,比如要求spinner默认不选中任何一项。
如果你自定义spinner,那这个当然不是问题;也可以在原有的选项列表中开头增加一项空字符串项,默认显示这个空字符串也达到了效果,不过采用这种方式需要你在获取被选择项的位置时忽略空字符串项。经过一番摸索,发现我们只要保证 spinner第一次展示时不显示即可,相关代码如下:
boolean isSpinnerFirst = true ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main) ; Spinner spinner = (Spinner)findViewById(R.id.spinner) ; spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (isSpinnerFirst) { //第一次初始化spinner时,不显示默认被选择的第一项即可 view.setVisibility(View.INVISIBLE) ; } isSpinnerFirst = false ; } @Override public void onNothingSelected(AdapterView<?> parent) { } }) ; }
4、安卓文本中一些特殊的文本输入,需要使用ASCII码
/article/2015374.html
5、文本颜色的字体选择器,注意不是用drawable了,而是使用color,(虽然drawable可以用颜色表示)
下面这个是字体颜色的选择器
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- index首页底部选择字体的 颜色选择器 --> <item android:state_selected="true" android:color="@color/font_blue_color"></item> <item android:color="@color/font_black_color"></item> </selector>
下面这个是按钮的背景选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@color/btn_rigth_pressed" android:state_pressed="true"></item> <item android:drawable="@color/btn_right_normal"></item> </selector>
6、
今天无意中碰见了 case expressions must be constant expressions 的问题
写了一个
[java] view
plaincopy
switch (v.getId()) {
case R.id.ivTitleBtnRightImage:
LuTaiService xxService = mFragmentCallBack.getService();
if (xxService == null || !xxService.isAuthenticated()) {
return;
}
new AddRosterItemDialog(mFragmentCallBack.getMainActivity(),
xxService).show();// 添加联系人
break;
default:
break;
}
导入到其它的工程里面 case R.id.ivTitleBtnRightImage : 出现了错误
错误提示为:case expressions must be constant expressions
网上查了一下 发现是 我的工程 勾选了isLibrary 的原因,将 勾选 去掉 再clear一下 就好
7、调用webService出现
正常情况下,android使用google的ksoap2这个包,就可以正常调用webService,前提条件是,服务端回传的必须是xml数据。
出现这个异常,原因是服务端回传的不是xml数据,而是如下图所示
可以看到,回传的数据不是传统的xml数据,当ksoap2解析服务端数据,发现不是xml数据就报错了
这个时候,就不能用ksoa2去调用webService了,必须使用传统的http协议,发送post请求,代码如下
8、TabHost组件,添加TabWidget时,默认是有分割线的,可以在xml进行控制。
<TabWidget android:id="@android:id/tabs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:showDividers="none"//这样tabwidget内tab间的分割线就没有了,就可以做viewpager的指示器了(内容是个imageview),显示到viewpager的哪一个item android:divider="#ff00ff" //这样tabwidget内tab间就又分割线了,而且分割线的颜色为#ff00ff > </TabWidget>
9、出现java.net.SocketException: socket failed: EACCES (Permission denied)
是没有添加权限,到主配置文件加上相应权限即可
10、fragmentTabHost之间 用bundle传值
// host.addTab(选项卡,内容,参数Bundle); host.addTab(tab, fragments[i], bundle);
11、ViewUtil.inject()要放在setContenView()之下,否则出现空指针异常
12、一个float 保留2位小数,转成字符串
float result=(float) Math.random() * 30 + 15; String r=String.format("%.2f", result); //保留2为小数
13、PullToRefresh
在初始化完成PullToRefreshListView后,通过lv.getLoadingLayoutProxy()可得到一个ILoadingLayout对象,这个对象可设置各种指示器中的样式、文本等。
[java] view
plaincopy
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy();
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
默认是上拉和下拉的字同时改变的,如果希望单独改变呢:
[java] view
plaincopy
private void initIndicator(){
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(
false, true);
endLabels.setPullLabel("你可劲拉,拉2...");// 刚下拉时,显示的提示
endLabels.setRefreshingLabel("好嘞,正在刷新2...");// 刷新时
endLabels.setReleaseLabel("你敢放,我就敢刷新2...");// 下来达到一定距离时,显示的提示
参考http://blog.csdn.net/mwj_88/article/details/39185921/
/article/8230233.html
https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1215/2166.html
补充,这个控件有headView,所以索引是从1开始的,0为head
public void onItemClick(AdapterView<?> parent, View v, int position, long id) { doSomething(parent.getAdapter().getItem(position)); }
在listView的setOnItemClickListener最后写上面的代码
或者 listData.get(position-1)
否则出现指针越界异常
参考
http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html
http://blog.csdn.net/sbvfhp/article/details/44959917
14、Android showDialog时报错requestFeature()
must be called before adding content
01-08 10:06:54.670: E/AndroidRuntime(1968): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:192)
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.internal.app.AlertController.installContent(AlertController.java:234)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.AlertDialog.onCreate(AlertDialog.java:314)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.Dialog.dispatchOnCreate(Dialog.java:335)
01-08 10:06:54.670: E/AndroidRuntime(1968): at android.app.Dialog.show(Dialog.java:248)
01-08 10:06:54.670: E/AndroidRuntime(1968): at com.android.test.showDialog(MainActivity.java:121)
出现此问题是由于dialog.show()之前调用了dialog.setContentView()或者dialog.getwindow()等,正确的应该是dialog.show()之后调用dialog.setContentView()
参考
/article/8241412.html
15、xutil的一些参考文档
http://www.tuicool.com/articles/MVNzUnI
Xutils3的使用
http://www.w2bc.com/Article/84851
xutil的多文件上传填写
HttpUtils http = new HttpUtils(10000); RequestParams params = new RequestParams(); //设置文件 MultipartEntity entity = new MultipartEntity(); for (int i = 0; i < fileList.size();i++) { entity.addPart("file" + i,new FileBody(fileList.get(i))); } try { entity.addPart("creator", new StringBody(create_id_txt)); entity.addPart("record_id", new StringBody(problem_id_txt)); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
16、android给listview的item设定高度失败
/article/2813039.html
四种方案解决ScrollView嵌套ListView问题
http://bbs.anzhuo.cn/thread-982250-1-1.html17、
MultipartEntity与UrlEncodedFormEntity区别
http://www.pm-road.com/index.php/2014/10/16/118/18 java去除字符中的HTML标记
http://shenyuc629.iteye.com/blog/1876378
19、常用的2个shape 和selector
下面这个是空心有边框的shape
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 实心 --> <solid android:color="@android:color/white" /> <!-- 边框 --> <stroke android:width="0.5dp" android:color="#CBCBCB" /> <!-- 圆角 --> <corners android:radius="3dp" /> <!-- 边距 --> <padding android:bottom="1dp" android:left="6dp" android:right="6dp" android:top="1dp" /> </shape>
下面是一个正常情况透明,点击变色的selector
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" > <shape> <solid android:color="@color/btn_green_predss" /> </shape> </item> <item android:state_enabled="false" > <shape> <solid android:color="@android:color/transparent" /> </shape> </item> <item> <shape> <solid android:color="@android:color/transparent" /> </shape> </item> </selector>
20、
//GridView的常用布局 <GridView android:id="@+id/gridView" android:layout_below="@id/actionbarLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="3" android:stretchMode="columnWidth" android:listSelector="@android:color/transparent" /> //ListView的常用布局 <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/white" android:divider="#EBE7E8" android:dividerHeight="1dip" android:fadingEdge="none" android:fastScrollEnabled="false" android:footerDividersEnabled="false" android:headerDividersEnabled="false" android:smoothScrollbar="true" />
21、在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果?
http://www.2cto.com/kf/201312/268110.html
View itemView=View.inflate(context, R.layout.item_hr_have_publish_position_detail, null);//这个是想要得到的layout布局 int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); itemView.measure(w, h); int height =itemView.getMeasuredHeight();//这里得到了布局的高度
//一个得到屏幕高度的工具类
ScreenUtil.initScreen(ReceiveResumeActivity.this); int ScreenH=ScreenUtil.getScreenH();
if(position==mResult.getTargetJobList().size()-1&&(position+1)*height>ScreenH){ popWin.showAsDropDown(view, 0, -144); //点击listView中的最后一个item,并且item的总长度大于屏幕高度,popupWindow显示上面 }else{ popWin.showAsDropDown(view, 0, 0); //否则,popupWindow显示在item屏幕下方 }
22、常用的技巧
一、标题栏的隐藏
方法1、
在Activity的oncreate方法中添加requestWindow()方法,需要注意的是它必须放在setsetContentView()方法之前,否则会报错。
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
……}
方法2、
在配置文件Xml中设置Acitivity的theme属性
[java] view
plain copy
<activity
android:theme="@android:style/Theme.NoTitleBar"
android:name=".Test" >
……
</activity>
二、状态栏的隐藏
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
……}
在Activity的oncreate方法中添加requestWindow()方法,在setsetContentView()方法之前之后都可以。
三、全屏的实现
方法1、
在Activity的oncreate方法中设置
[java] view
plain copy
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
……}
方法2、
在配置文件Xml中设置Acitivity的theme属性
[java] view
plain copy
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".Test" >
……
</activity>
注意:
以上三点只针对某一个Acitivity窗口进行设置,若想针对应用程序所有的Activity,那么直接在配置文件里进行设置,如
[java] view
plain copy
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
那么所有Activity都会隐藏标题栏和状态栏,全屏显示。
23、unable to find attribute android:preserveIconSpacing 这个错误如何解决?
http://www.imooc.com/qadetail/89022
点击V7包找到values文件夹 ,打开attrs.xml , ctrl+f 查找 MenuView , 将preserveIconSpacing注释掉或者删掉
, clean项目
24、Android PullToRefresh (ListView GridView
下拉刷新) 使用详解
/article/7811504.html
25、Google自己的下拉刷新组件SwipeRefreshLayout
谷歌官方的swiperefreshlayout圆圈式下拉刷新,因为加了两个新的v4和v7兼容包,所以才有圆圈的效果,如果没有新的v4和v7兼容包,就是旧的彩线的效果.这里仅提供新的圆圈式效果。
如果想用圆圈的样式,需要去Android sdk manager里把Android support library升级到最新23版,如果是19版样式仍然是横线
26 SwipeMenuListView 需要引入一个外部库,代码
// step 1. 设置item 目录 SwipeMenuCreator creator = new SwipeMenuCreator() { @Override public void create(SwipeMenu menu) { //设置目录的选项 SwipeMenuItem deleteItem = new SwipeMenuItem(context); // 设置目录背景 ,这里设置为红色 deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9, 0x3F, 0x25))); // 设置背景宽度 deleteItem.setWidth(DensityUtil.dip2px(context, 90)); // 设置背景图片 deleteItem.setIcon(R.drawable.ic_delete); //添加都目录里 menu.addMenuItem(deleteItem); } }; //listView要添加目录 lvPosition.setMenuCreator(creator); // step 2. 设置目录监听器 lvPosition.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override //目录的index ,表示目录item的数量,从0开始 //position 表示listView item的数量 public void onMenuItemClick(int position, SwipeMenu menu, int index) { Position entity = positionList.get(position); switch (index) { case 0: // 取消收藏 cancleCollect(entity.getPositionId()); positionList.remove(entity); adapter.notifyDataSetChanged(); break; } } });
27、点击查看大图代码 ,见youzi 的PositionDetailActivity
//点击查看大图 private URL url=null; private Bitmap bitmap = null; private AlertDialog alertdialog ; private ImageView imgView; private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==1){ imgView.setImageBitmap(bitmap); alertdialog.show(); alertdialog.setContentView(imgView); } }; }; //--点击查看大图分割线
private void lookBigPic() { if (!TextUtils.isEmpty(detail.getLogo())) { // CustomApplication.getBitmapUtils().display(ivLogo, URLConfig.SERVER_HOST_IMAGE + detail.getLogo()); alertdialog = new AlertDialog.Builder(context).create(); imgView = new ImageView(context); imgView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); new Thread(new Runnable() { LoadingDialog dialog= PromptUtil.showLoadingDialog(context,null);; @Override public void run() { try { url = new URL(URLConfig.SERVER_HOST_IMAGE + detail .getLogo()); InputStream is = url.openConnection().getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bitmap = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ PromptUtil.closeLoadingDialog(dialog); Message message=new Message(); message.what=1; handler.sendMessage(message); } } }).start(); } }
28、
现在有一种需求,一个按钮的背景要显示3种颜色
1、enable模式
2 disables模式
3、点击press模式
4、不可press模式就是enable模式,默认都是为true
多用在短信验证码的按钮上
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 设置按压 --> <item android:state_pressed="true" > <shape> <solid android:color="@color/btn_rigth_pressed" /> </shape> </item> <!-- 是否可以点击 --> <item android:state_enabled="true"> <shape> <solid android:color="@color/btn_right_normal" /> </shape> </item> <item android:state_enabled="false"> <shape> <solid android:color="#CDCDCD" /> 这里是灰色颜色 </shape> </item> </selector>
29、一个会犯错的布局,
如果一个Relative布局里面还有RelativeLayou,这个布局有点击事件,需要在里面的RelativeLayout布局里写clickable=true事件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:orientation="horizontal"> <RelativeLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_marginBottom="7dp" android:layout_marginTop="7dp" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:text="钱夫人" android:textColor="#000000" android:textSize="@dimen/main_text_size" /> <TextView android:id="@+id/tv_phone_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_toRightOf="@+id/tv_name" android:text="15989009065" android:textColor="#000000" android:textSize="@dimen/main_text_size" /> <TextView android:id="@+id/tv_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tv_name" android:layout_below="@+id/tv_name" android:layout_marginRight="8dp" android:layout_marginTop="10dp" android:ellipsize="end" android:maxLines="2" android:text="广州市天河区五山科华街" android:textColor="@color/font_gray_color" android:textSize="@dimen/sub_text_size" /> </RelativeLayout> <View android:id="@+id/view_line" android:layout_width="0.6dp" android:layout_height="match_parent" android:layout_marginBottom="6dp" android:layout_marginTop="6dp" android:background="@color/line_gray_color" /> <RelativeLayout android:id="@+id/rl_edit_address" android:layout_width="40dp" android:layout_height="match_parent" android:background="@drawable/selector_listview_item" android:clickable="true" > <ImageView android:id="@+id/iv_edit_address" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerInParent="true" android:src="@drawable/icon_edit_address" /> </RelativeLayout> </LinearLayout>
30、压缩图片的2个笔记
1个是通过bitmap来压缩,适合通过startAcitivityForResult变形图片后,得到bitmap,上传到后台
1个是通过file来压缩,适合选择图片通过uri得到file上传到后台,要压缩来节省流量
http://www.360doc.com/content/14/0428/17/11800748_372972179.shtml
http://104zz.iteye.com/blog/1694762
/** * 通过url得到图片文件 * @param uri * @return * @author hemiy */ public File getFileByUri(Uri uri) { String path = null; if ("file".equals(uri.getScheme())) { path = uri.getEncodedPath(); if (path != null) { path = Uri.decode(path); ContentResolver cr = context.getContentResolver(); StringBuffer buff = new StringBuffer(); buff.append("(").append(Images.ImageColumns.DATA).append("=").append("'" + path + "'").append(")"); Cursor cur = cr.query(Images.Media.EXTERNAL_CONTENT_URI, new String[] { Images.ImageColumns._ID, Images.ImageColumns.DATA }, buff.toString(), null, null); int index = 0; int dataIdx = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { index = cur.getColumnIndex(Images.ImageColumns._ID); index = cur.getInt(index); dataIdx = cur.getColumnIndex(Images.ImageColumns.DATA); path = cur.getString(dataIdx); } cur.close(); if (index == 0) { } else { Uri u = Uri.parse("content://media/external/images/media/" + index); System.out.println("temp uri is :" + u); } } if (path != null) { return new File(path); } } else if ("content".equals(uri.getScheme())) { // 4.2.2以后 String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); return new File(path); } else { Log.i("d", "Uri Scheme:" + uri.getScheme()); } return null; }
31、一些android的小知识点
判断服务是否启动
检测屏幕是否开启
获取进程名称
检测应用是否运行
http://www.tuicool.com/articles/juqIN3J32、如何去掉ListView底部的ListDivider
/article/7970787.html
所以,如果ListView的高度是fill_parent,那么当Item很少,而没有能填满ListView的高度的时候,底部就会出现分割线。反之,如果ListView的高度是wrap_content,那么ListView的高度就是随着Item的增多而变高的,最后一行的Item始终是达到了ListView的底部,也就不会出现分割线了。
33、
让ListView实现跟QQ、微信、陌陌那样信息从底部开始
/article/9851732.html
让自己的聊天界面ListView实现向众多聊天软件那样从底部开始,其实很简单,只需要在实例化的ListView设置setStackFromBottom(true);即可实现刚刚开始的信息是显示在底部的~~
相关文章推荐
- Android Studio 编码设置,解决Android Studio项目运行时乱码问题
- Android中Handler的使用
- Android的事件分发
- Service中的onStartCommand()方法的三种返回值的含义以及理解
- Android 6.0 StrictController
- Android的四个应用层
- Android中的Handler与Looper
- Android学习之Asynctask异步操作
- 关于android 三种jar包导入方式的备注
- Android_使用Android studio分析内存泄露
- 如何在Android和iOS设备上录制游戏?
- 如何在Android和iOS设备上录制游戏?
- android编码的理解2
- [Andorid开发艺术探索 读书笔记]Activity的生命周期和启动模式 (一)
- 【Android】源码项目编译ccache配置
- Android4.4 平板背光设置
- 关于Android内存泄露问题
- android多语言适配--语言对应的资源文件夹名称
- 【Android】源码项目编译ccache配置
- 我所认识的Android(一)