今天又看到Android的apisdemos里面有一个多选框,于是又查了源码,结果发现,ListView已经实现了多选,还有单选等操作,只需要一些简单的设置就可以了.
但有一个前提,似乎是Adapter需要有它的getItemId返回不同的值,可以代码不同的数据,如果有两个值是一样的,似乎不可行.如果要改变原来的选框的行为,需要重写ListView的performItemClick方法了.
选中的结果可以从ListView.getCheckItemIds得到所选的id,然后根据id从数据列表中处理.
当然ListView如果要使用这样的方式 还需要两点,ListView.setchoice()这里要多选的,multi_choice.还有ListView.setitemcanfocus(false).
修改com.android.server.status.StatusBarService类中的方法:
(1) public void systemReady() {
...
//这里把 Gravity.TOP -> Gravity.BOTTOM
lp.gravity = Gravity.BOTTOM | Gravity.FILL_HORIZONTAL;
lp.setTitle("StatusBar");
lp.windowAnimations = R.style.Animation_StatusBar;
WindowManagerImpl.getDefault().addView(view, lp);
}
(2) void onBarViewAttached() {
...
//这里把 Gravity.TOP -> Gravity.BOTTOM
lp.gravity = Gravity.BOTTOM | Gravity.FILL_HORIZONTAL;
lp.setTitle("TrackingView");
lp.y = mTrackingPosition;
mTrackingParams = lp;
WindowManagerImpl.getDefault().addView(mTrackingView, lp);
}
方法(1)是系统启动的时候,服务读取状态栏时调用的方法。
屏幕加载窗体涉及到进程之间的通讯。而各个窗体加载时都是以状态栏的为参考点,位于状态栏之下的。
如果不修改窗体加载时的参考点,状态栏移到最下面后,则各个窗体会显示在屏幕之外。
窗体的位置计算在PhoneManagerService类中进行。在public void beginLayoutLw()修改:
把mDockTop= mContentTop = mCurTop = mStatusBar.getFrameLw().bottom; 更改为:
mDockTop =mContentTop = mCurTop = 0;
即以屏幕的左上角坐标(0,0)为参考点
修改mDockBottom ,mCurBottom, mContentBottom 的值,让它最终的值与下移后的状态栏的TOP位置一样。修改成:mDockBottom = mContentBottom = mCurBottom = ( displayHeight - mStatusBar.getFrameLw().height());
也可以修改成:mDockBottom = mContentBottom = mCurBottom = mStatusBar.getFrameLw().top;
使用广播接收器有两种方法,一种是建立一个BroadcastReceiver类,这种很常见,任何情况都可以接受;还有一种是在一个应用里注册个接收器,通过registerReceiver,这种需要应用打开的时候才生效,应用销毁了,还要解除注册。
广播接收器的onReceiver的有效执行时间是10s,一般情况,当这个方法执行完,接收器就销毁了,但是超过10s,即使没执行完毕,也会自动销毁,所以复杂耗时的操作不要放在这里执行,可以把数据通过intent传给一个activity,或service去处理,具体方法和平时一样的操作,只是如果启动外部APK的组件,activity 需要加上setFlags,service需要加上属性 android:exported="true",这样就没什么问题。