1.安卓中是不允许在子线程中进行UI操作的,可通过runOnUiThread()方法将线程切换到主线程,然后再更新UI元素,这样不需要通过handler事件传递到主线程更新UI。
new Thread(new Runnable(){ //如果是非耗时操作,这里也可以是函数方法
//这里进行其它耗时操作
runOnUiThread(new Runnable(){
@Override
public void run(){
//这里根据上面的执行结果进行UI操作
}
});
}).start();
2.向上滚动隐藏标题栏的效果,可通过AppBarLayout、RecyclerView、Toolbar来实现。形如下面的代码,app:layou_scrollFlags中scroll表示当RecyclerView向上滚动时,Toolbar会跟着一起向上滚动并实现隐藏,enterAlways表示会跟着一起向下滚动并重新显示,snap表示当Toolbar还没有完全隐藏或显示时,会根据当前滚动距离自动选择是隐藏还是显示。AppBarLayout能够让Toolbar不至于被RecyclerView遮挡,它实际上是一个垂直方向的LinearLayout
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id=“@+id/toolbar”
android:layout_width="match_parent"
android:layout_height="?/actionBarSize"
app:layou_scrollFlags=“scroll|enterAlways|snap”/>
<android.support.v7.widget.RecyclerView
android:id=“@+id/recycler_view”
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<android.support.design.widget.FloatingActionButton
android:id=“@+id/fab”
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_done"/>
</android.support.design.widget.AppBarLayout>
3.下拉刷新可通过SwipeRefreshLayout包裹RecyclerView控件来实现,然后用代码绑定刷新事件。
swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
// 下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法
swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 这里是主线程
// 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行,处理了之后通过
// runOnUiThread更新adpter之类,然后刷新界面
// TODO 获取数据
}
});
4.想让背景图能够和系统状态栏融合,需借助android:fitsSystemWindows属性来实现,fitsSystemWindows只作用在Android4.4及以上的系统,4.4以下无透明效果,4.4~5.0是全透明,5.0以上是半透明。这个属性可以给任何view设置,只要设置了这个属性此view的其他所有padding属性失效,同时该属性的生效条件是,只有在设置了状态栏(StatusBar/Toolbar)或者导航栏(NavigationBar)为透明时此属性才会生效。在默认情况下,多个view设置该属性时,只有最外层的view才会起作用。指定成透明色的方法很简单,在主题中将android:statusBarColor属性的值,指定成@android:color/transparent就可以了。兼容性写法:
右击res目录,->new->Directory,创建一个values-v21目录,然后右击values-v21目录->New ->Values resource file,创建一个styles.xml文件。
<resources>
<style name="TransparentTheme" parent="AppTheme">
<item name="android:statusBarColor">@color/transparent</item>
</style>
</resources>
该主题中将状态栏的颜色设置成了透明,并继承与AppTheme,并且由于values-21目录,只有安卓5.0以上才会去读取,要使安卓5.0以上兼容,需在原有的styles.xml文件中添加一行代码
<style name="TransparentTheme" parent="AppTheme">
</style>
这样对于安卓5.0以上的系统,能在这里读取该属性,将什么都不做。最后,还需要让活动使用这个主题才行,修改AndroidManifest.xml中的代码,在活动申明的地方添加一行代码
android:theme="@style/TransparentTheme"
当然,这里也可以通过代码实现,不过更建议用资源文件的方式。