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

安卓实习期间整理知识点(一)

2015-04-01 21:37 417 查看

安卓实习期间整理知识点(一)

layout_gravity和gravity区别

android:gravity是对元素本身说的,元素本身的文本显示在什么地方靠着换个属性设置,不过不设置默认是在左侧的; android:layout_gravity是相对与它的父元素说的,说明元素显示在父元素的什么位置

比如说button: android:layout_gravity 表示按钮在界面上的位置。 android:gravity表示button上的字在button上的位置

layout_visibility visible, invisible, gone区别

而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。

ListView Adapter的小细节

为了防止adapter在加载时出现NullPoninterException, 可在getCount()中进行判断。

@Override
public int getCount() {
return (mDateList == null)? 0 : mDateList.size();
}


使用Adapter使ListView显示不同类型的item

1.BaseAdapter: Common base class of common implementation for an Adapter that can be used in both ListView (by implementing the specialized ListAdapter interface} and Spinner (by implementing the specialized SpinnerAdapter interface.

实现Adapter的普通基类,可以用于ListView与Spinner

2.ListAdapter是ArrayAdapter的一个子类,它们都采用了观察者模式(DataSetObservable),可调用notifyDataSetChanged()方法通知ListView的item(Observer)进行更新

可以重写getItemViewType()和getViewTypeCount()方法,在getView()中先进行调用并得到convertView.

相关类:ArrayAdapter, CursorAdapter, SimpleAdapter, ResourceCursorAdapter

Java BaseAdapter源码

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
private final DataSetObservable mDataSetObservable = new DataSetObservable();

public boolean hasStableIds() {
return false;
}

public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}

public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}

/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}

/**
* Notifies the attached observers that the underlying data is no longer valid
* or available. Once invoked this adapter is no longer valid and should
* not report further data set changes.
*/
public void notifyDataSetInvalidated() {
mDataSetObservable.notifyInvalidated();
}

public boolean areAllItemsEnabled() {
return true;
}

public boolean isEnabled(int position) {
return true;
}

public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}

public int getItemViewType(int position) {
return 0;
}

public int getViewTypeCount() {
return 1;
}

public boolean isEmpty() {
return getCount() == 0;
}
}


getView()实例

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ProcessViewHolder processViewHolder = null;
UnprocessViewHodler unprocessViewHodler;
int type = getItemViewType(position);

if(convertView == null){
switch (type) {
case PROCESS_DATE_TYPE:
convertView = mInflater.inflate(R.layout.date_list_item_process, null);
processViewHolder = new ProcessViewHolder();
processViewHolder.ivTechnician = (ImageView)    convertView.findViewById(R.id.iv_technician);
processViewHolder.ibPhone = (ImageButton)   convertView.findViewById(R.id.ib_phone);
processViewHolder.ibSms = (ImageButton) convertView.findViewById(R.id.ib_sms);
processViewHolder.tvDistance = (TextView)   convertView.findViewById(R.id.tv_person_distance);
processViewHolder.btnCancel = (Button)  convertView.findViewById(R.id.btn_cancel_date);
processViewHolder.tvDateTime = (TextView)   convertView.findViewById(R.id.tv_date_time);
processViewHolder.tvDateAddress = (TextView)    convertView.findViewById(R.id.tv_date_address);
processViewHolder.tvDateType = (TextView)   convertView.findViewById(R.id.tv_date_type);
processViewHolder.btnNavigation = (Button)  convertView.findViewById(R.id.btn_navigation);
processViewHolder.ibEnsure = (ImageButton)  convertView.findViewById(R.id.ib_ensure);
processViewHolder.ibDelete = (ImageButton)  convertView.findViewById(R.id.ib_delete);
convertView.setTag(processViewHolder);

break;
case UNPROCESS_DATE_TYPE:

break;
default:
break;
}
} else{
switch (type) {
case PROCESS_DATE_TYPE:
processViewHolder = (ProcessViewHolder) convertView.getTag();

break;
case UNPROCESS_DATE_TYPE:

break;
default:
break;
}
}

switch (type) {
case PROCESS_DATE_TYPE:

break;
case UNPROCESS_DATE_TYPE:

break;
default:
break;
}

return convertView;
}

class ProcessViewHolder {
ImageView ivTechnician;
ImageButton ibPhone;
ImageButton ibSms;
TextView tvDistance;
Button btnCancel;
TextView tvDateTime;
TextView tvDateAddress;
TextView tvDateType;
Button btnNavigation;
ImageButton ibEnsure;
ImageButton ibDelete;
}
}


Fragment中setUserVisibleHint()方法

setUserVisibleHint()在onCreate方法和onCreateView()方法之间执行

setUserVisibleHint()方法

public void setUserVisibleHint (boolean isVisibleToUser)

Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.

An app may set this to false to indicate that the fragment's UI is scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior.

Parameters
isVisibleToUser     true if this fragment's UI is currently visible to the user (default), false if it is not.


使用实例

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
//fragment
if(personList !=null && personList.size() !=0){
handler.obtainMessage(SET_PERSONLIST).sendToTarget();
}else{
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.obtainMessage(SET_PERSONLIST).sendToTarget();
}
}).start();
}
}else{
//fragment
}
super.setUserVisibleHint(isVisibleToUser);
}


实用注解简化findViewById过程

使用了单例设计模式,只有一个实例

对传入的对象进行反射,扫描成员变量与方法的注解,最后进行findViewById

如果传入的对象为Activity类,可以直接获取单例进行startInit().如果传入的对象为View类,需要在startInit()前调用setContentView()方法.

public class AutoViewInitializer implements OnClickListener {

private Object mInitObject;
private View mContentView;

public static AutoViewInitializer newInstance(Object object) {
return new AutoViewInitializer(object);
}

private AutoViewInitializer(Object object) {
mInitObject = object;
}

public AutoViewInitializer setContentView(View view) {
mContentView = view;
return this;
}

public void startInit() {
if(mInitObject != null) {
initFields();
initMethods();
}
}

private void initFields() {
Field[] fields = mInitObject.getClass().getDeclaredFields();
if(fields != null) {
for(Field field : fields) {
TargetView annotation = field.getAnnotation(TargetView.class);
if (annotation != null) {
int id = annotation.id();
setField(field, id);
}
}
}
}

private void setField(Field field, int id) {
try {
field.setAccessible(true);
field.set(mInitObject, findViewById(id));
} catch (Exception e) {
e.printStackTrace();
}
}

private void initMethods() {
Method[] methods = mInitObject.getClass().getDeclaredMethods();
for (Method method : methods) {
TargetView annotation = method.getAnnotation(TargetView.class);
if(annotation != null) {
int id = annotation.id();
String function = annotation.attribute();

if(function.equals("OnClick")) {
findViewById(id).setOnClickListener(this);
}
}
}
}

@Override
public void onClick(View v) {
Method[] methods = mInitObject.getClass().getDeclaredMethods();
for (Method method : methods) {
TargetView annotation = method.getAnnotation(TargetView.class);
if(annotation != null) {
int id = annotation.id();
if (id == v.getId()) {
invokeMethod(method, v);
}
}
}
}

private void invokeMethod(Method method, View v) {
try {
method.invoke(mInitObject, v);
} catch (Exception e) {
e.printStackTrace();
}
}

private View findViewById(int id) {
if (mContentView == null) {
return ((Activity)mInitObject).findViewById(id);
} else {
return mContentView.findViewById(id);
}
}
}


ImageButton与Button之间的不同

继承不同:

java.lang.Object ↳ android.view.View ↳android.widget.ImageView ↳ android.widget.ImageButton

java.lang.Object ↳ android.view.View ↳ android.widget.TextView ↳android.widget.Button

因而ImageButton 不支持setText,而Button支持。反之,ImageButton 支持setImageResource,而Button不支持。Button和ImageButton有Button的状态,但是ImageView没有。

显示差异(ImageButton 拥有默认背景)

默认背景(layout_width与layout_height必须是wrap_content,否则会显示边框)

<style name="Widget.ImageButton">
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:scaleType">center</item>
<item name="android:background">@android:drawable/btn_default</item>
</style>


使用中得差异

ImageView = Display Images (android:src)

ImageButton = Diaplay Images as imageView and get click effect as button (android:src) and > cannot set text to it. ImageButton不能setText, 用android:src设置图片

Button = set text and (android:background) Button用android:background设置图片,可设置文本

参考资料

android中ImageView、ImageButton、Button之间的区别

Difference between Button with image, ImageButton, and clickable ImageView?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android