AndoidTips(个人总结,持续更新)

1.在代码中为组件设置背景色时,注意使用0xXXXXXXXX,而不是0xXXXXXX,否则将导致设置效果不可见。

2.在布局文件中可以使用<include/>和<merge/>标签来实现布局,其中<merge/>和<includ/>的不同之处在于,merge能够在嵌套时过滤调用用<merge>修饰的组件。详见:http://stackoverflow.com/questions/8834898/what-is-the-purpose-of-androids-merge-tag-in-xml-layoutshttp://write.blog.csdn.net/postedit/16879533

3.一种搜索栏的合理设计,将"搜索按钮"和"正在搜索中"进度条做在一起。这样做的好处是:既可以在搜索时表示当前状态,又可以避免两次连续的搜索提交。

4.一种多页面下的异常情况刷新按钮设计方案,将刷新按钮放置到屏幕的右上角(可以是在一个工具栏中)。这样使用一个按钮就可完成多个页面的手动刷新动作。相比于为每个界面写一个包含手动刷新按钮的提示页减轻了许多的工作量。

5.两个重叠页面的切换,可以使用ViewSwitcher来实现。例如在布局文件中有<ViewSwitch><LinearLayout><LinearLayout></ViewSwitch>,那么可以在代码中通过ViewSwitcher.setDisplayedChild(int index)来实现切换,不过需要注意的是ViewSwitcher只能包含两个child view。且ViewSwitcher继承自ViewAnimator,ViewAnimator又继承自FrameLayout,这里主要封装了一些关于切换动画的属性。

6.java中泛型数组的一种创建方法:T[] t = (T[])new Object[LENGTH];

7.注意Java中使用向上/向下转型时的数据类型为double,否则容易出错,如:Math.ceil(5/2),期望得到3,但实际上得到的确实2,因为5/2先背运算成2,再由Match.ceil(2)得到2。正确的写法是Math.ceil(5/2.0)。

8.Andorid中的程序文件读取,以图片为例:
      Assets:

private Bitmap getBitmapFromAsset(String strName)  {
        AssetManager assetManager = getApplicationContext().getAssets();
        InputStream istr = null;
        try {
            istr = assetManager.open("snap/pic.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
        Bitmap bitmap = BitmapFactory.decodeStream(istr);
        return bitmap;
    }

      /res/raw:

	private Bitmap getBitmapFromRaw()  {
      InputStream is = getResources().openRawResource(R.raw.pic);
      Bitmap bitmap = BitmapFactory.decodeStream(is);
      return bitmap;
    }

 9.设置重复背景:

android:background="@drawable/panel_bg_tile" android:tileMode="repeat"

10.创建最经济的临时锁对象:

零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock= new Object()则需要7行操作码。

private byte[] lock = new byte[0]; // 特殊的instance变量

11.不要使用简单的for循环来改变数组中的元素,因为那样是没用的。如:

boolean[] bArray = new boolean[5];
		for(int i=0;i<bArray.length;i++) {
			bArray[i] = false;
		}
		for(boolean b:bArray) {
			b = true;
		}
		for(boolean b:bArray) {
			System.out.println(b);
		}

将输出5个false

12.使用shape定义圆角按钮时,在android3.0以前,android:bottomLeftRadiusandroid:bottomRightRadius是相反的,解决方法是在将android3.0以前的放到res新建一个drawable-v12的文件夹中,而android3.0以后的仍然放到drawable文件夹中即可。

13.可以使用TextView,并设置其背景色来作为分割线。

14.在onCreate方法中获取组件的长宽的方法:

final LinearLayout imageViewContainer = (LinearLayout)findViewById(R.id.crop_photo_image_view_container);
        imageViewContainer.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            boolean isFirst = true;//默认调用两次,这里只让它执行一次回调
            @Override
            public void onGlobalLayout() {
                if (isFirst) {
                    isFirst = false;
                    //现在布局全部完成,可以获取到任何View组件的宽度、高度、左边、右边等信息
                    Log.i("CDH", "Global W:"+imageViewContainer.getMeasuredWidth()+"  H:"+imageViewContainer.getMeasuredHeight());
                }
            }
        });

15.在使用WebView加载内容时,注意提供一个网络异常提示页,在请求失败时加载。避免请求URL及参数都暴露出来,具体可见WebViewClient的onReceivedError回调方法。

16.Android程序开发过程中,需要添加一个全局异常捕获功能,来帮助bug的重现与调试。具体涉及到的类是UncaughtExceptionHandler。

17.取消程序启动时,显示程序名效果:修改style.xml中的主题,如:

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="android:windowIsTranslucent">true</item> 
           <item name="android:windowNoTitle">true</item> 
    </style>

18.代码中设置字体大小:tv_nickname.setTextSize(TypedValue.COMPLEX_UNIT_SP,16);使用TypedValue.COMPLEX_UNIT_SP.

19.在代码中将TextView的字体加粗:

TextView tv = (TextView)findViewById(R.id.tv);
TextPaint tp = tv.getPaint();
tp.setFakeBoldText(true);

20.在内部类中引用外部变量,提示将变量修改成final的。

for(int i=0;i<10;i++) {

     final j = i;

    view.setOnClickListener(new View.onClickListener() {

        j++;

        //i ++;

    })

}

21.如果美工出的设计图是根据ios来的,那么可能遇到一些ios使用指定像素能很快搞定,而Android却要大费周章的情况。可以使用布局及代码相结合的方式来完成界面布局及适配。在xml中设置好组件的层级结构,然后在代码中使用setLayoutParams方法,来调整组件的位置。如:

		iv_1.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            boolean isFirst = true;//默认调用两次,这里只让它执行一次回调
            @Override
            public void onGlobalLayout() {
                if (isFirst) {
                    isFirst = false;
                    //现在布局全部完成,可以获取到任何View组件的宽度、高度、左边、右边等信息
                    Log.e("CDH", "Global W:"+iv_1.getMeasuredWidth()+"  H:"+iv_1.getMeasuredHeight());
                    
                    LayoutParams p1 = new LayoutParams(LayoutParams.FILL_PARENT,20);
                    p1.leftMargin = iv_1.getWidth() ;
                    p1.addRule(RelativeLayout.CENTER_VERTICAL);
                    bg_permission_1.setLayoutParams(p1);
                    
                    LayoutParams p2 = new LayoutParams(LayoutParams.FILL_PARENT,20);
                    p2.rightMargin = iv_4.getWidth() ;
                    p2.addRule(RelativeLayout.CENTER_VERTICAL);
                    bg_permission_4.setLayoutParams(p2);
                }
            }
        });

22.在配置接口URL地址时,可能遇到URL中包含变量的情况,这时可以使用String.format(/base/%s/xxx, value),其中的%s可以被value来替换

23.写一个抽象的ListArrayAdapter,再让其他的Adapter继承它,这样可以简化代码:

public abstract class ArrayListAdapter<T> extends BaseAdapter {
	
	protected ArrayList<T> mList;
	protected Activity mContext;
	protected ListView mListView;
	
	public ArrayListAdapter(Activity context){
		this.mContext = context;
	}

	@Override
	public int getCount() {
		if(mList != null)
			return mList.size();
		else
			return 0;
	}

	@Override
	public Object getItem(int position) {
		return mList == null ? null : mList.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	abstract public View getView(int position, View convertView, ViewGroup parent);
	
	public void setList(ArrayList<T> list){
		this.mList = list;
		notifyDataSetChanged();
	}
	
	public ArrayList<T> getList(){
		return mList;
	}
	
	public void setList(T[] list){
		ArrayList<T> arrayList = new ArrayList<T>(list.length);  
		for (T t : list) {  
			arrayList.add(t);  
		}  
		setList(arrayList);
	}
	
	public ListView getListView(){
		return mListView;
	}
	
	public void setListView(ListView listView){
		mListView = listView;
	}
}

24.右击项目,选择Android Tools,再选择Run Lint:check for common errors,会出现一个窗口,里面有很多提示,有security,performance,correctness等分类,可以参考优化程序性能。
25.Eclipse打开文件报错,即使删除后,重新解压以后依然如此的话。可以将configuration文件夹下除了config.ini和...simpleconfigurator文件夹之外的所有我那件删除,可以解决问题。

26.使EditText不默认获取焦点而弹出软键盘的方法,在其父控件(layout)中设置fcousableInTouchMod和focusable为true。

27.使用Afinal的FianlBitmap加载图片时,有时需要先加载缩略图,然后在加载原图(通常在图片浏览模块用到),可以使用以下代码:

BitmapDisplayConfig config = new BitmapDisplayConfig();
				AlphaAnimation animation = new AlphaAnimation(1, 1); //取消动画效果,否则会出现闪屏的感觉
				animation.setDuration(500);
				config.setAnimation(animation);
				config.setLoadfailBitmap(fb.getBitmapFromCache(thumbUrls[position]));
				config.setLoadingBitmap(fb.getBitmapFromCache(thumbUrls[position]));
				fb.display(photoView, urls[position], config);

28.前段时间做项目,有一个UI设计是上方一个公共头,下方四个滚动列表。起先用Fragment做框架,外层用scrollview内层用listview,期间解决了listview与scrollview冲突的问题,后来发现在ScrollView嵌套了listview后,会疯狂的从头到尾调用listview的getView方法,由于加载的listview的item是复杂内容,这样就导致了整个加载过程很耗时,而且很容易卡死界面。。最终没方法,决定全部重写,单用listview,公共头就用header来做。当然问题不止这么一点。这里仅仅是描述一种方法,可以将任意的scrollview转成listview。
29.TextView中字体局部加粗:

if(comment.getParent() != null) {
						String text = comment.getUser().getNickname() 
								+ ": " + "@" + comment.getParent().getNickname() + " " + comment.getText();
						SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
						spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD)
							,0,comment.getUser().getNickname().length()+ 1,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
						holder.comment_list_tv_2.setText(spannableStringBuilder);	
					} else {
						String text = comment.getUser().getNickname() + ": " + comment.getText();
						SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
						spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD)
							,0,comment.getUser().getNickname().length()+ 1,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
						holder.comment_list_tv_2.setText(spannableStringBuilder);	
					}

参考:http://blog.csdn.net/hitlion2008/article/details/6856780
30.重新登录账号后,需要清空上一个账号信息及缓存,但是不要忘了此时需要判断一下是否为同一个用户重新登录,如果是的话,就不需要删除缓存了。

31.Q:setBackgroundResources in ImageButton doesn't work

A:For ImageButton use setImageResource(int resId),但是使用setImageResource则无法动态的改变组件的大小(适配方面考虑),此时可以在布局文件中使用scaleType="fitXY"来弥补。

32.手动隐藏显示软键盘

	private void showKeyboard(){
		((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(et_comment, 0);  
	}
	
	private void hideKeyBoard(){
		InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
		imm.hideSoftInputFromWindow(et_comment.getWindowToken(), 0);
	}

33.控制scrollview滚动到底部

handler.post(new Runnable() {  
    @Override  
    public void run() {  
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);  
    }  
});  

34.设置EditText的最大输入字符方法:

     一、在xml中,android:maxLength="10"

     二、在代码中使用InputFilter,//editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 即限定最大输入字符数为20

     三、使用TextWatcer,

public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub
		Editable editable = editText.getText();
		int len = editable.length();
		
		if(len > maxLen)
		{
			int selEndIndex = Selection.getSelectionEnd(editable);
			String str = editable.toString();
			//截取新字符串
			String newStr = str.substring(0,maxLen);
			editText.setText(newStr);
			editable = editText.getText();
			
			//新字符串的长度
			int newLen = editable.length();
			//旧光标位置超过字符串长度
			if(selEndIndex > newLen)
			{
				selEndIndex = editable.length();
			}
			//设置新光标所在的位置
			Selection.setSelection(editable, selEndIndex);
			
		}
	}

35.Android导入Library后原工程无法生成R文件,一种可能是Library和原工程不在同一个盘符下。

36.ListView的setEmptyView()方法是有限制的,使用的EmptyView必须包含在目标布局里,可以设置为gone,当listview内容为空时,emptyview会被显示出来。

37.异常处理:java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference

     原因:In your public View getView method change return null to convertView;

38.launch mode,在Intent中设置Flag和在清单文件中设置launch mode是不一样的,在intent中设置clear_top或者single_top会调用Activity的onCreate方法,而在清单文件中设置launch mode为singleinstance不会调用onCreate方法。这种区别的一种使用场景时,程序没有在运行,后台推送消息,单击跳转到消息列表再返回到首页的场景。

39.设置listView的item间距,可以在xml布局文件中的listView下设置xml属性:

android:divider="#00000000"
android:dividerHeight="18dp"
解释:分隔线透明,高度为18dp。
40.在Fragment中当使用startActivityForResult(Intent intent,int requestcode) 方法调用外部的activity的时候。一般大多数人都会使用onActivityforResult来接受返回值。但是直接在该Fragment中是无法接受到返回值的。处理方法就是在在与其绑定的FragmentActivity中重写onActivityResult方法就可以接收到返回值

41.设置Activity切换动画时的%和p的含义:

android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。

android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。

 42. 

cannot be cast to android.widget.HeaderViewListAdapter

如果你在ListView/setAadapter(adapter)之后再addHeaderView()或者addFooterView,那么在你ListView.removeHeaderView和ListView.removeFooterView之时也会报这个异常,所以我们一样要确保自己的addHeaderView(view)和addFooterView(view)方法是在ListView.setAdapter(adapter)之前执行

这个错误,在有些设备上有问题,有些设备没问题

43.使用百度地图,自定义定位图标时,禁止图标转向,可以通过MyLocationData.Bilder().direction(0)来实现。







 



 

 


 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值