移动OA.docx
《移动OA.docx》由会员分享,可在线阅读,更多相关《移动OA.docx(18页珍藏版)》请在冰豆网上搜索。
![移动OA.docx](https://file1.bdocx.com/fileroot1/2023-6/8/de2f3ea8-53d2-4a03-8427-a03c78d6351c/de2f3ea8-53d2-4a03-8427-a03c78d6351c1.gif)
移动OA
1,关于View中的getContext()方法的用法:
Context context = view.getContext();
//通过view对象的getContext方法获得的Context对象,就是view所依附的Activity的上下文;
if (context instanceof Activity)
{
Activity activity = (Activity)context;
}
自定义适配器中动态生成View的时候,添加View前先调用removeAllViews()方法移除所有的其它View,然后再添加;
自定义线性布局中设置布局中的View的宽或高:
利用View中的onWindowFocusChanged方法实现动态控制View对象的宽和高;
@Override
publicvoidonWindowFocusChanged(booleanhasFocus){
super.onWindowFocusChanged(hasFocus);
DisplayMetricsdm=context.getResources().getDisplayMetrics();
intscreenWidth=dm.widthPixels;
splite_view.getLayoutParams().width=screenWidth/7;
}
范例:
DutyActivity布局中只有一个LinearLayout,自定义LinearLayout中有三个TextView,点击不同的TextView,在自定义LinearLayout的ViewPager中进行添加到ViewPager中的不同自定义View的切换;
此时我们可以在自定义View或布局中写一个方法:
//设置View的宽和高;
publicvoidsetSplitViewWidth(){
WindowManagermanager=(WindowManager)this.getContext()
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetricsdm=newDisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
intscreenWidth=dm.widthPixels;
splite_view.getLayoutParams().width=screenWidth/3;
}
然后在自定义Activity的代码块如下:
//显示医生值班;视图;
publicvoidshowDoctorDutyView(Stringsearchdate){
dutyLayout.removeAllViews();
DoctorDutyViewv=newDoctorDutyView(this.getApplicationContext(),searchdate);
//先添加View到布局中;
dutyLayout.addView(v);
//设置自定义LinearLayout的宽度为屏幕的1/3;
v.setSplitViewWidth();
Toast.makeText(this,"执行了",0).show();
}
利用ViewFlipper来定时切换图片;
//设置页面进入和出去的动画;
viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_left_in));
viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_left_out));
//显示下一页;
viewFlipper.showNext();
currentPage++;
ViewFilpper控件是系统自带控件之一,主要为在同一个屏幕间的切换及设置动画效果,且可以自动播放,用法如下:
配置文件:
viewflipper_layout.xml
12android:
id="@+id/viewflipper"
3android:
layout_width="match_parent"
4android:
layout_height="match_parent"
5android:
inAnimation="@anim/slide_in"
6android:
outAnimation="@anim/slide_out"
7android:
flipInterval="2000">
8//将要切换的几个界面;
9
10
11
12
13
ViewFlipperextendsViewAnimator:
所以继承了ViewAnimator中的showNext()和showPrevious()方法;利用这两个方法进行来回的切换;
ViewPager用法:
主要用来实现翻页功能
ViewPagerextendsViewGroup是作为容器类使用的;
可以用ViewGroup中的addView方法添加页面;
ViewPager做为容器类,可以结合View(Layout)和Fragment(Android3.0才引入的),官方文档说ViewPager+Fragment配合使用更好。
ViewPager不在androidsdk自带jar包中,来源google的补充组件android-support-v4.jar,
actionBar.setBackgroundDrawable(myDrawable);
在ActionBar上设置背景后,ActionBar会自动缩放你的背景图;
默认情况下,actionBar放在你的activity的顶部,且作为activity布局的一部分。
设置成为覆盖模式后,actionBar相当于漂浮在activity之上,不干预activity的布局。
设置如下:
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.main);
ImageView的setBackgroundResource和setImageResource的区别:
setImageResource是和xml布局中的src的属性相匹配的,而setBackgroundResource是和xml中的background属性相匹配的。
Android中通过代码获取arrays.xml文件中的数据
android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组、整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过代码来获取相应的数组数据
1、数组中的数据为具体的值:
String[]items=getResources().getStringArray(R.array.select_dialog_items);获取整型数组的数据方法为:
publicint[]getIntArray(intid)throwsNotFoundException
获取文本数组的数据方法为:
publicCharSequence[]getTextArray(intid)throwsNotFoundException
二、数组中的数据为对资源数据的引用:
比如arrays.xml文件中的数组如下:
- @drawable/latest
- @drawable/video
- @drawable/radio
代码中获取该数组资源的具体代码如下:
TypedArraytypedArray=getResources().obtainTypedArray(R.array.feed_icons);
//-1为ResourceId不存在时的默认值;
intfeedResId=typedArray.getResourceId(index,-1);
获取arrays.xml中数据项为引用资源数据的数组时,首先通过Resources类中的obtainTypedArray方法获取到TypedArray实例,然后通过TypedArray方法中的getResourcesId方法获取数组中每一项的资源id,这样就能顺利地引用到数组中资源了。
通过代码获取arrays.xml中的数组资源时,数组中的元素项不宜过多,特别是一次性获取的时候,有可能你在使用时它还没有获取到你需要使用的数组项。
注意事项
通过android的arrays.xml获取数组信息时,在代码中初始化数组时建议通过线程初始化,避免在初始化的时候阻塞UI线程。
向SQLite中批量添加记录(放到一个事务中);
Stringsql="insertintoadsbook_emp"......;
//对SQL语句进行预编译;
SQLiteStatementstat=pileStatement(sql);
//批量插入数据;
db.beginTransaction();
for(AdsBookEmpemp:
list){
//绑定参数(index:
1--last);
stat.bindString(1,emp.empId);
stat.bindString(2,emp.empName);
stat.bindString(3,emp.orgId);
stat.executeInsert();
}
db.setTransactionSuccessful();
db.endTransaction();
db.close();
每个View对象都是有布局参数的(实例):
参数的宽和高用户可以更改;
Viewsplite_view;
floatc_x=startIndex*splite_view.getLayoutParams().width;
floatx=endIndex*splite_view.getLayoutParams().width;
Animationanimation=newTranslateAnimation(c_x,x,0,0);
animation.setFillAfter(true);//True:
图片停在动画结束位置37
animation.setDuration(200);
splite_view.startAnimation(animation);
currentIndex=endIndex;
//不显示一个Activity的图标或Logo;
actionBar.setDisplayShowHomeEnabled(false);
//显示默认的返回键;
actionBar.setDisplayHomeAsUpEnabled(true);
//设置导航模式为List列表导航;
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(newArrayAdapter(
DutyActivity.this,R.layout.item_txsjlist,R.id.tv_txsj,
newString[]{"总值班","医生值班","护士值班"}),this);
String.format()用法:
StringBuffersb=newStringBuffer();
sb.append(String.format("%d-%02d",datePicker.getYear(),datePicker.getMonth()+1));
格式字符串可能包含以下的转义码:
%c-接受一个数字,并将其转化为ASCII码表中对应的字符
%d,%i-接受一个数字并将其转化为有符号的整数格式
%o-接受一个数字并将其转化为八进制数格式
%u-接受一个数字并将其转化为无符号整数格式
%x-接受一个数字并将其转化为十六进制数格式,使用小写字母
%X-接受一个数字并将其转化为十六进制数格式,使用大写字母
%e-接受一个数字并将其转化为科学记数法格式,使用小写字母e
%E-接受一个数字并将其转化为科学记数法格式,使用大写字母E
%f-接受一个数字并将其转化为浮点数格式
%g(%G)-接受一个数字并将其转化为%e(%E,对应%G)及%f中较短的一种格式
%q-接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s-接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式,可以在%号后添加参数.参数将以如下的顺序读入:
(1)符号:
一个+号表示其后的数字转义符将让正数显示正号.默认情况下只有负数显示符号.
(2)占位符:
一个0,在后面指定了字串宽度时占位用.不填时的默认占位符是空格.
(3)对齐标识:
在指定了字串宽度时,默认为右对齐,增加-号可以改为左对齐.
(4)宽度数值
(5)小数位数/字串裁切:
在宽度数值后增加的小数部分n,若后接f(浮点数转义符,如%6.3f)则设定该浮点数的小数只保留n位,若后接s(字符串转义符,如%5.3s)则设定该字符串只显示前n位.
switch(sUriMatcher.match(uri)){
caseID:
//匹配到id;
if(selection==null)
/*
*//比如:
content:
//"+FirstProvierMetaData.AUTHORIY+"/users/1"
*//getPathSegments()得到的是users和1,get
(1)会得到1
*/
selection="id='"+uri.getPathSegments().get
(1)+"'";
else
selection+="and(id='"+uri.getPathSegments().get
(1)+"')";
cursor=db.query(DatabaseHelper.DEPARTMENT_TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
break;
CursorLoader异步查询内容:
操作ContentProvider中的内容时,我们一般使用CursorLoader异步查询内容,数据库操作是非常耗时的,对于任何数据库和ContentProvider查询来说,做好不要在UI线程中执行,这点很重要。
1>Loader简介:
通过LoaderManager可以在每个Activity和Fragment中使用Loader。
这些Loader被用来异步加载数据和监控底层数据源的变化。
CursorProvider允许针对ContentProvider执行异步查询并返回一个结果Cursor,而且对底层提供的任何更新都会发出通知。
在Activity中的应用:
@Override
publicLoaderonCreateLoader(intLOADER_ID,Bundlearg1){
StringuriStr="content:
//com.provider.test/table_name/id";
//CursorLoader会查询出所有的元素;
CursorLoadercursorLoader=newCursorLoader(this,Uri.parse(uriStr),null,null,null,null);
returncursorLoader;
}
//Loader查询完成时,结果Cursor会返回到onLoadFinished方法的arg1中;
@Override
publicvoidonLoadFinished(Loaderarg0,Cursorarg1){
//
}
@Override
publicvoidonLoaderReset(Loaderarg0){
}
SQLiteQueryBuilder和SQLiteQuery的使用;
onWindowFocusChanged重要作用andActivity生命周期
这个事件可以实现当一个Activity完全加载完毕后,然后就执行这个onWindowFocusChanged指的是这个Activity得到或者失去焦点的时候就会call。
。
也就是说如果你想要做一个Activity一加载完毕,就触发什么的话完全可以用这个!
Activity生命周期中,onStart,onResume,onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。
译注:
从onWindowFocusChanged被执行起,用户可以与应用进行交互了,而这之前,对用户的操作需要做一点限制。
我们在onWindowFocusChanged方法中可以获取某一个View的具体位置和宽高的,而在其他标准生命周期的接口中调用都是获取不到的,比如在onResume,onStart中都获取不到信息。
相应的执行顺序的打印:
1:
entry:
onStart---->onResume---->onAttachedToWindow---->onWindowVisibilityChanged--visibility=0---->onWindowFocusChanged(true)--->
2.exit:
onPause--->onStop---->onWindowFocusChanged(false)---(lockscreen)
3.exit:
onPause----->onWindowFocusChanged(false)-------->onWindowVisibilityChanged--visibility=8------------>onStop(toanotheractivity)
点击Button使ViewPager跳转到特定页码的页面:
currentIndex=0;
//使ViewPager跳转到某一页;
viewPager.setCurrentItem(0);
CalendarView控件:
Android3.0及以上版本自带的日历控件,我们可通过流动鼠标滑轮来选择上一月或是下一月,
有的朋友可能在Android3.0以下的版本做开发,如果在Android3.0以下的版本中使用日历控件,第一种解决方案是使用第三方开发的控件
这是CalendarView的效果图。
可以实现上月和下月翻页,设置事件等。
如果是打开日历控件界面则可通过如下方式:
startActivity(newIntent(Intent.ACTION_VIEW).setDataAndType(null,CalendarActivity.MIME_TYPE));
如果是想点击控件上选择某一个日期并返回结果,可通过下面方式:
//打开日历控件界面
startActivityForResult(newIntent(Intent.ACTION_PICK).
setDataAndType(null,CalendarActivity.MIME_TYPE),100);
//重写onActivityResult()方法处理返回的日期
@Override
publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
if(resultCode==RESULT_OK){
intyear=data.getIntExtra("year",0);//得到年
intmonth=data.getIntExtra("month",0);//得到月
intday=data.getIntExtra("day",0);//得到天
//格式化日期显示
finalCalendardat=Calendar.getInstance();
dat.set(Calendar.YEAR,year);
dat.set(Calendar.MONTH,month);
dat.set(Calendar.DAY_OF_MONTH,day);
//显示日期结果
SimpleDateFormatformat=newSimpleDateFormat("yyyyMMMdd");
Toast.makeText(TestActivity.this,format.format(dat.getTime()),Toast.LENGTH_LONG).show();
}
}
datePicker.init(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH),null);
////设置不显示CalendarView,即上面的View;
datePicker.setCalendarViewShown(false);
TextView中setTag附带其它的数据:
setTag(finalObjecttag)//附带一个任何对象;