第一次进来用先取以前下载的广告页面本次使用,进入首页之后下载会下载,供下次使用。
这里的实现还是挺好的,把相关代码提取封装到了LoginBackground类中,对外提供了下载和获取缓存图片的方法接口。开始我在想是否可以设计成单例,但是想一想后发现其实这里并不需要单例,《重构与模式》中说过,在实现一个单例之前,需要仔细思考。如果遇到一个本不应该被实现为单例的单例,不要犹豫,内联他。这里既是如此。
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
/>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
LinearLayout>
<fragment
android:id="@+id/navigation_drawer"
android:name="net.coding.program.NavigationDrawerFragment_"
android:layout_width="280dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
tools:layout="@layout/fragment_navigation_drawer"
/>
android.support.v4.widget.DrawerLayout>
看这个布局,就可明白,侧拉采用的是v4包下的DrawerLayout,左侧菜单栏是一个fragment:NavigationDrawerFragment,右侧内容区域是Toolbar+ container(framelayout)。
在点击的时候,onNavigationDrawerItemSelected,会将对应的container动态替换对应的fragment。UsersListFragment、TaskFragment、ProjectFragment、SettingFragment。
@Override
public void onBackPressed() {
exitApp();
}
private void exitApp() {
if ((System.currentTimeMillis() - exitTime) > 2000) {
showButtomToast("再按一次退出Coding");
exitTime = System.currentTimeMillis();
} else {
finish();
}
}
采用的是个NoHorizontalScrollViewPager,通过显示不同的子view来实现切换且流畅的效果。NoHorizontalScrollViewPager里放的是fragment集合,MenuProjectFragment、ProjectOtherFragment、ProjectListFragment。
我看到这个view的时候,以为作者使用的是自定义view,其实作者使用的是checkbox
"@+id/generateReadme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/push_checkbox"
android:button="@null" />
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/push_checkbox_on" />
<item android:drawable="@drawable/push_checkbox_off" />
selector>
布局:
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_EEEEEE"
android:orientation="vertical"
tools:context="net.coding.program.project.SearchProjectActivity">
"@layout/activity_search_project_actionbar" />
.coding.program.common.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="48dip"
android:background="@android:color/transparent"
android:visibility="gone" />
.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
"@+id/emptyListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@color/transparent"
android:clipToPadding="false"
android:divider="@color/color_DDDDDD"
android:dividerHeight="0.5dp"
android:drawSelectorOnTop="true"
android:listSelector="@color/transparent"
android:overScrollMode="never"
android:footerDividersEnabled="false"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="none"
android:visibility="gone" />
输入框、PagerSlidingTabStrip、ViewPager、ListView
ListView用于存放搜索历史
ViewPager中存放不同的fragment
搜索的缓存实现:SearchCache类,单例实现,底层保存采用的是SharedPreferences。
ExpandableStickyListHeadersListView+SwipeRefreshLayout
DropdownButton\DropdownListView组成
v7包下的alertdialog
是webview
是webview
FlowLabelLayout,扩充自FlowLayout
MaopaoListFragment,传递不同的参数,显示不同的页面
WebActivity
内容不是使用的是webview,URLSpanNoUnderline用来解析 url 以跳转到不同的界面
点赞动画
MaopaoLikeAnimation.playAnimation(good, v);
CustomShareBoard,继承自PopupWindow
JazzyListView
MessageListActivity
在当前页面做了一个轮询,实现类似即时通讯的效果
输入框部分采用自定义view做了封装
PhotoPickActivity、看大图ImagePagerFragment
UsersListActivity
采用第三方IndexableListView
UserDetailActivity
File[] cacheDir = getAllCacheDir();
for (File item : cacheDir) {
deleteFiles(item);
}
showMiddleToast("清除缓存成功");
updateCacheSize();
File[] getAllCacheDir() {
return new File[] {
getActivity().getCacheDir(),
getActivity().getExternalCacheDir()
};
}
计算:
void updateCacheSize() {
File[] cacheDir = getAllCacheDir();
long size = 0;
for (File dir : cacheDir) {
size += getFileSize(dir);
}
String sizeString = String.format("%.2f MB", (double) size / 1024 /1024);
dispayCacheSize(sizeString);
}
删除缓存的时候只考虑了系统默认的缓存位置。
Coding Android客户端用到的一些开源库
https://blog.coding.net/blog/android-open-source-library
https://coding.net/u/coding/p/Coding-Android/git