您的位置:首页 > 移动开发 > Android开发

记性不好,记录一些android开发中的东东

2014-09-22 13:39 381 查看
1.button设置背景图片为.9格式的时候发现文字被覆盖了,后来老郑说设置padding="0dp"就OK了,虽然还不知道为什么。(2014-9-22)

2.scrollview做弹性的时候内容不满屏,用权重布局有误,老郑说scrollview里+fillViewport属性就OK了。

3.获取获取当前系统的时间(东八区24小时制度)

publicstaticStringgetPekingTime()
{
SimpleDateFormatsDateFormat=newSimpleDateFormat("yyyyMMddkkmmss");
sDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
//Stringdate=sDateFormat.format(newjava.util.Date());
returnsDateFormat.format(newjava.util.Date());
}


4.字体适配(比较笨的方法,网上看的)

/**
*根据效果图的字体大小来适配
*美工给的效果图为1080x1920(下面的/1920是根据高度算比例)
*@paramcontext
*@paramtextSize//效果图上获取到字体的大小(px)
*@return
*/
publicintgetFontSize(Contextcontext,inttextSize){
DisplayMetricsdm=newDisplayMetrics();
WindowManagerwindowManager=(WindowManager)context
.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
intscreenHeight=dm.heightPixels;
//screenWidth=screenWidth>screenHeight?screenWidth:screenHeight;
//intscreenWidth=dm.widthPixels;
//intrate=(int)(textSize*(float)screenWidth/1080);

intrate=(int)(textSize*(float)screenHeight/1920);
returnrate;
}
使用方法:textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,getFontSize(main_Fragment.getActivity(),44));


5.用Fragment和tabhost做主界面,界面切换时会重新加载布局,网上有hide和show的方法,但我想界面切换或重新出现的时候onResume()会执行,

hide和show的方法就不行了。网上有另一种方法:

privateViewview;//缓存起来的布局避免每次切换都重新加载一遍
<spanstyle="white-space:pre">	</span>@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Log.i(TAG,"onCreateView");
if(view==null){
view=inflater.inflate(R.layout.account,container,false);

//初始化控件之类的事
}
ViewGroupparentGroup=(ViewGroup)view.getParent();//缓存的view需要判断是否已经被加过parent,如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
if(parentGroup!=null){
parentGroup.removeView(view);
}
returnview;
}


6.EditText里hint字体大小修改(网上的)

/**
*修改edittext的hint字体大小
*@parameditText
*/
publicvoidchangeedittexthint(EditTexteditText)
{
//新建一个可以添加属性的文本对象
//SpannableStringss=newSpannableString("喝酒就要喝一斤!");
SpannableStringss=newSpannableString(editText.getHint());

//新建一个属性对象,设置文字的大小
AbsoluteSizeSpanass=newAbsoluteSizeSpan(12,true);

//附加属性到文本
ss.setSpan(ass,0,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//设置hint
editText.setHint(newSpannedString(ss));//一定要进行转换,否则属性会消失
}


7.一个界面有多个需要跳转到其他界面的intnet,搞成方法,传递activity对象

privatevoidsetintent(Classactivity){
//TODOAuto-generatedmethodstub
startActivity(newIntent(context,activity));
}
调用:
setintent(SecondActivity.class);


8.背景变暗,可用与一些弹框场景

设置为1f的时候变回原形

WindowManager.LayoutParamslp=getWindow().getAttributes();
lp.alpha=0.4f;
getWindow().setAttributes(lp);


9.搞了个输入密码的AlertDialog弹框,跑起来的时候发现软键盘点不出来,百度了一下,选了个简单的方法:
http://blog.csdn.net/wy978651775/article/details/21026999
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);


这是默认情况下隐藏软键盘的方法,要重新显示软键盘,要执行下面这段代码:

alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

AlertDialog.setView()则不会出现以上问题。

测试了可以一用,但软键盘如果自动跑出来效果更好些,有百度了一下:
http://ask.csdn.net/questions/208
里面的回答有两张可行的方法:

one:在编辑框上做文章

editText.setOnFocusChangeListener(newView.OnFocusChangeListener(){
@Override
publicvoidonFocusChange(Viewv,booleanhasFocus){
if(hasFocus){
alertdialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
two:当创建了对话框之后你可以请求一个软件键盘
alertdialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);


下面的是项目里的一个东东
dlg.setOnCancelListener(newOnCancelListener(){//防止不进行操作而直接取消弹出框而导致开关状态异常
@Override
<spanstyle="white-space:pre">				</span>publicvoidonCancel(DialogInterfacearg0){
<spanstyle="white-space:pre">					</span>//TODOAuto-generatedmethodstub
<spanstyle="white-space:pre">					</span>if(boolean){
<spanstyle="white-space:pre">						</span>slipswitch.setSwitchState(false);//检测按钮状态
<spanstyle="white-space:pre">					</span>}else{
<spanstyle="white-space:pre">						</span>slipswitch.setSwitchState(true);//检测按钮状态
<spanstyle="white-space:pre">					</span>}//slipswitch.refreshDrawableState();//刷新开关按钮的布局(不知道这个为何不起作用)
<spanstyle="white-space:pre">					</span>slipswitch.postInvalidate();//会调用控件的onDraw()重绘控件
<spanstyle="white-space:pre">				</span>}
<spanstyle="white-space:pre">			</span>});
http://blog.csdn.net/newcman/article/details/7782237


10.每次写注释里的时间和作者都要自己敲,略感麻烦,百度了一下:
windows-->preference-->Java-->CodeStyle-->CodeTemplates-->Comments-->Types-->右边的Edit按钮
将里面的东东替换为这个东东即可,当然名字改你自己的。(快捷键shift+alt+j)个人还是喜欢:/**+回车
/**
*@authorlzl
*@date${date}${time}
*${tags}
*/


11.textview各种设置字体http://blog.sina.com.cn/s/blog_9f233c0701012rdj.html
TextViewmTextView=null;
SpannableStringmsp=null;
//设置字体大小(绝对值,单位:像素)
msp.setSpan(newAbsoluteSizeSpan(20),4,6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(newAbsoluteSizeSpan(20,true),6,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
//第二个参数booleandip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
myTextView.setText(msp);


12.一直想搞类似QQ菜单的弹出的效果,不得其法,发现一篇可以实现的文章
(Android实现由下至上弹出并位于屏幕底部的提示框)http://www.linuxidc.com/Linux/2012-04/59153.htm

13.美工给了一套720的图片,一些大图怎么搞都适配不了多个屏幕,无法根据宽度适配高度。百度了N久,找到一个保存长宽比的的东东
android:adjustViewBounds="true"http://blog.csdn.net/go12355/article/details/4030182314.在activity里面让控件setAnimation动画正常启动,但放到工具类里面的时候就没反应了,看源码的注释也不明所以,百度良久,
发现了setAnimation和startAnimation的区别(http://stackoverflow.com/questions/10909865/setanimation-vs-startanimation-in-android里的user2024270推测是正确的)

Thisismyunderstanding.SetAnimationwhentheviewisaddedtotheviewGroup,animationwillbecalled.whentheviewhasbeenadded,theanimationwillnotbecalledStartAnimationanimation
willbecalledallthetimeeventhoughtheviewhasbeenadded.
15.<requestFocus/>标签用于指定屏幕内的焦点View。

例如我们点击tab键或enter键焦点自动进入下一个输入框用法:将标签置于Views标签内部

16.http://blog.csdn.net/pengchua/article/details/7582949(搞jni的)

17.eclipse写jni一直提示Method'NewStringUTF'couldnotberesolved
项目右键->属性->c/c++常规->CodeAnalysis,选择"Useprojectsettings"中的方法无法被解析(Methodcannotberesolved)取消选择,应用->确定,然后刷新、清理、刷新、build项目。

18.jni输出日志(c++)#include<android/log.h>__android_log_print(ANDROID_LOG_INFO,"JNIMsg","ELEMENT%dIS%d\n",1,2);Android.mk里面添加LOCAL_C_INCLUDES:=$(LOCAL_PATH)/include
LOCAL_LDLIBS+=-L$(SYSROOT)/usr/lib-llog

19.美工的效果图要实现这种效果http://zilla.blog.51cto.com/3095640/984775
百思不得其解,后来QQ群有人发了这个地址,虽然我不知道里面的代码是什么意思,但我知道他的用意,修改一下,可以实现效果

计算好了之后调用这个方法即可

Stringtemp=(String)TextUtils.ellipsize(txt,(TextPaint)paint,textLength,TextUtils.TruncateAt.END);

20.在代码里动态创建radiobutton,发现设置selector无效,百度了一下

设置颜色的selector,有两种方法

Resourcesresource=(Resources)context.getResources();
ColorStateListcsl=(ColorStateList)resource.getColorStateList(R.color.dialog_radio_textcolor_selector);
radioButton.setTextColor(csl);
另一种:

XmlPullParserxrp=context.getResources().getXml(R.color.dialog_radio_textcolor_selector);
try{
ColorStateListcsl=ColorStateList.createFromXml(context.getResources(),xrp);
radioButton.setTextColor(csl);
}catch(Exceptione){
}
设置drawableRight的selector

<spanstyle="white-space:pre">	</span>DrawabledrawableRight=context.getResources().getDrawable(R.drawable.dialog_check_selector);
drawableRight.setBounds(0,0,drawableRight.getMinimumWidth(),drawableRight.getMinimumHeight());
radioButton.setCompoundDrawables(null,null,drawableRight,null);
xml里的@button=null就用radioButton.setButtonDrawable(android.R.color.transparent);

21.listview设置了适配器但适配器里的getview没有执行,百度了一下

ListView控件本身在xml中设置了gone也不会执行getView
22.要将List<Map<String,Object>>list对象保存在列表listStack里面,直接add(list),但后面有list.clear()的操作,这个listStack里面的也跟着清空了,看来listStack里保存的是引用了。老郑说用clone,百度了半天也是一头雾水。后来QQ群里有人说深复制可以用流形式,姑且一试,发现真的可以,就是不知道跟用迭代将list里的元素一个个抠出来哪个好用了。

publicObjectcopy()throwsIOException,ClassNotFoundException{
ByteArrayOutputStreambos=newByteArrayOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(bos);
oos.writeObject(你的对象);
ObjectInputStreamois=newObjectInputStream(newByteArrayInputStream(bos.toByteArray()));
returnois.readObject();
}
这个返回类型Object改成List<Map<String,Object>>,返回值也强转成List<Map<String,Object>>即可。

23.搞gridview的时候发现item填充父容器了,但跑起来发现四周有空隙,百度了一下

发现加上android:listSelector="@null"即可

24.用小米2S测试的时候,突然发现切换到横屏的时候竟然无效,在代码里使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

竟然卡死,吓了一跳。

百度了一下,http://www.cnblogs.com/jiutiandiwang/archive/2012/08/07/2627016.html

publicvoidsetRequestedOrientation(intrequestedOrientation){

return;

}

加上这个方法就好了。

25.银联iso8583报文签到返回的62域为双倍长密钥3DES加密的密文,百度良久,找到了有人写好了的Java算法
http://zhangzxl.iteye.com/blog/1768571
26.ListView下拉刷新,当从其他界面跳回来的时候就去调用listview的下拉方法来更新数据,发现数据无法新数据获取下来了

但显示的还是旧的数据,找了一下,发现如果listview是最初始的位置的时候LogListView.setSelection(0),这个函数是无法更新listview的

最后还是得加上logAdapter.notifyDataSetChanged()才可以更新数据

27.EventBus主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息
http://blog.csdn.net/djun100/article/details/23762621
28.网页里的JS调用android里的方法,测试之后没问题就上线,结果就悲催了,有的手机竟然回调不了,后来百度良久,终于发现是版本的问题,

用4.12的手机测试没问题,用4.4的手机测就出问题,只要在android里的那个本地方法加个@JavascriptInterface,再引入对应的包包就行了。

如:

@JavascriptInterface
publicvoidHTMLCALLANDROID(){
//dosomething
}

29.闲着没事抛一下异常

publicclasstestexception{

<spanstyle="white-space:pre">	</span>publicstaticvoidmain(String[]args){
<spanstyle="white-space:pre">		</span>try{
<spanstyle="white-space:pre">			</span>method1();
<spanstyle="white-space:pre">		</span>}catch(Exceptione){
<spanstyle="white-space:pre">			</span>//TODO:handleexception
<spanstyle="white-space:pre">			</span>System.out.println(e.getMessage()+"\n"+e.getCause());
<spanstyle="white-space:pre">		</span>}

<spanstyle="white-space:pre">	</span>}

<spanstyle="white-space:pre">	</span>privatestaticvoidmethod1()throwsException{
<spanstyle="white-space:pre">		</span>//TODOAuto-generatedmethodstub
<spanstyle="white-space:pre">		</span>method2();
<spanstyle="white-space:pre">	</span>}

<spanstyle="white-space:pre">	</span>privatestaticvoidmethod2()throwsException{
<spanstyle="white-space:pre">		</span>//TODOAuto-generatedmethodstub
<spanstyle="white-space:pre">		</span>method3();
<spanstyle="white-space:pre">	</span>}

<spanstyle="white-space:pre">	</span>privatestaticvoidmethod3(){
<spanstyle="white-space:pre">		</span>//TODOAuto-generatedmethodstub
<spanstyle="white-space:pre">		</span>try{
<spanstyle="white-space:pre">			</span>inti=1/0;
<spanstyle="white-space:pre">		</span>}catch(Exceptione){
<spanstyle="white-space:pre">			</span>//TODO:handleexception
<spanstyle="white-space:pre">			</span>thrownewIllegalArgumentException("method3throws",e);
<spanstyle="white-space:pre">		</span>}

<spanstyle="white-space:pre">	</span>}
}

30.关于休眠一下Android上用SystemClock.sleep(int);而java上用Thread.sleep(int);,百度了一下,发现android上的最终还是调用了Java上的。

就是封装了一下而已吧。

31.科学计数法转换成字符串

Stringsjiachun="12345E-10";
BigDecimaldb=newBigDecimal(sjiachun);//大数
Stringii=db.toPlainString();


32.判断recyclerview是否滚到到了最后一项,百度良久,最后群里的人说的

在滚动监听里添加少许代码即可

LinearLayoutManagerlm=(LinearLayoutManager)recyclerView.getLayoutManager();
if(lm.findLastVisibleItemPosition()>=recyclerView.getAdapter().getItemCount()-1){
//到最后一项了,没有到底
}


33.scrollview嵌套gridview,不滚了,就用来网上的方法:

publicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)
{
intexpandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec,expandSpec);

}
发现进入界面的时候直接滚到底部了,见鬼了,百度良久,发现

scrollview.smoothScrollTo(0,0);这个可以暂时用一下


34.因为虚拟键问题,搞到屏幕适配相对吐血,后老张说可以获取屏幕高度:
http://www.cnblogs.com/huxdiy/p/3977232.html
看了一下,发现方法过期了,百度了一下推荐的方法:

Displaydisplay=getWindowManager().getDefaultDisplay();

Pointsize=newPoint();

display.getSize(size);

intwidth=size.x;

intheight=size.y;

获取屏幕原始尺寸高度,包括虚拟功能键高度,

privateintgetDpi(){
intdpi=0;

Displaydisplay=getWindowManager().getDefaultDisplay();
DisplayMetricsdm=newDisplayMetrics();
@SuppressWarnings("rawtypes")
Classc;
try{
c=Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Methodmethod=c.getMethod("getRealMetrics",DisplayMetrics.class);
method.invoke(display,dm);
dpi=dm.heightPixels;
}catch(Exceptione){
e.printStackTrace();
}
returndpi;
}


两个值相减即可得到虚拟键的高度。


37.dialog在布局里设置全屏没有效果,设置一下即可
dialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);

38.http://my.oschina.net/liucundong/blog/354029?fromerr=KocmE0mO

外部html界面启动本地app

<!doctypehtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">

<metaname="apple-mobile-web-app-capable"content="yes">
<metaname="apple-mobile-web-app-status-bar-style"content="black"/>

<title>this'sademo</title>
<metaid="viewport"name="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui">
</head>
<body>
<div>
<aid="J-call-app"href="javascript:;"class="label">立即打开>></a>
<inputid="J-download-app"type="hidden"name="storeurl"value="http://m.chanyouji.cn/apk/chanyouji-2.2.0.apk">
</div>

<script>
(function(){
varua=navigator.userAgent.toLowerCase();
vart;
varconfig={
/*scheme:必须*/
scheme_IOS:'cundong://',
scheme_Adr:'cundong://splash',
download_url:document.getElementById('J-download-app').value,
timeout:600
};

functionopenclient(){
varstartTime=Date.now();

varifr=document.createElement('iframe');

ifr.src=ua.indexOf('os')>0?config.scheme_IOS:config.scheme_Adr;
ifr.style.display='none';
document.body.appendChild(ifr);

vart=setTimeout(function(){
varendTime=Date.now();

if(!startTime||endTime-startTime<config.timeout+200){
window.location=config.download_url;
}else{

}
},config.timeout);

window.onblur=function(){
clearTimeout(t);
}
}
window.addEventListener("DOMContentLoaded",function(){
document.getElementById("J-call-app").addEventListener('click',openclient,false);

},false);
})()
</script>
</body>
</html>

AndroidMainfext.xml

<activity
android:name=".activity.LauncherActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<actionandroid:name="android.intent.action.VIEW"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<categoryandroid:name="android.intent.category.BROWSABLE"/>
<dataandroid:host="splash"android:scheme="cundong"/>
</intent-filter>
</activity>



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: