#Day06 #
#下载模块布局 ##
// 初始化下载布局
FrameLayout flDetailDownload = (FrameLayout) view
.findViewById(R.id.fl_detail_downlod);
DetailDownloadHolder downloadHolder = new DetailDownloadHolder();
flDetailDownload.addView(downloadHolder.getRootView());
----------------------------
<FrameLayout
android:id="@+id/fl_detail_downlod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/detail_bottom_bg" >
</FrameLayout>
----------------------------
layout_detail_download.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn_fav"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/detail_btn_normal"
android:text="收藏"
android:textColor="#fff" />
<Button
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="2dp"
android:background="@drawable/detail_btn_normal"
android:text="分享"
android:textColor="#fff" />
<Button
android:id="@+id/btn_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:layout_toLeftOf="@id/btn_share"
android:layout_toRightOf="@id/btn_fav"
android:background="@drawable/progress_btn_normal"
android:text="下载"
android:textColor="#fff" />
</RelativeLayout>
线程池封装 ##
/**
-
线程管理器
* -
@author Kevin
*/
public class ThreadManager {private static ThreadPool mThreadPool; // 获取单例的线程池对象 public static ThreadPool getThreadPool() { if (mThreadPool == null) { synchronized (ThreadManager.class) { if (mThreadPool == null) { int cpuNum = Runtime.getRuntime().availableProcessors();// 获取处理器数量 int threadNum = cpuNum * 2 + 1;// 根据cpu数量,计算出合理的线程并发数 System.out.println("cpu num:" + cpuNum); mThreadPool = new ThreadPool(threadNum, threadNum, 0L); } } } return mThreadPool; } public static class ThreadPool { private ThreadPoolExecutor mExecutor; private int corePoolSize; private int maximumPoolSize; private long keepAliveTime; private ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) { this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.keepAliveTime = keepAliveTime; } public void execute(Runnable runnable) { if (runnable == null) { return; } // 线程池几个参数的理解: // 比如去火车站买票, 有10个售票窗口, 但只有5个窗口对外开放. 那么对外开放的5个窗口称为核心线程数, // 而最大线程数是10个窗口. // 如果5个窗口都被占用, 那么后来的人就必须在后面排队, 但后来售票厅人越来越多, 已经人满为患, 就类似于线程队列已满. // 这时候火车站站长下令, 把剩下的5个窗口也打开, 也就是目前已经有10个窗口同时运行. 后来又来了一批人, // 10个窗口也处理不过来了, 而且售票厅人已经满了, 这时候站长就下令封锁入口,不允许其他人再进来, 这就是线程异常处理策略. // 而线程存活时间指的是, 允许售票员休息的最长时间, 以此限制售票员偷懒的行为. if (mExecutor == null) { mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心线程数 maximumPoolSize, // 最大线程数 keepAliveTime, // 闲置线程存活时间 TimeUnit.MILLISECONDS,// 时间单位 new LinkedBlockingDeque<Runnable>(),// 线程队列 Executors.defaultThreadFactory(),// 线程工厂 new AbortPolicy()// 队列已满,而且当前线程数已经超过最大线程数时的异常处理策略 ); } mExecutor.execute(runnable); } }
}
使用线程池改造异步网络请求
LoadingPage
// 异步加载网络数据
ThreadManager.getThreadPool().execute(new Runnable() {
@Override
public void run() {
// 开始加载网络数据
final ResultState state = onLoad();
// 必须在主线程更新界面
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (state != null) {
// 更新当前状态
mCurrentState = state.getState();
// 更新当前页面
showRightPage();
}
}
});
}
});
MyBaseAdapter
/**
-
加载更多数据
*/
public void loadMore(final MoreHolder holder) {
ThreadManager.getThreadPool().execute(new Runnable() {@Override public void run() { // 获取更多数据 final ArrayList<T> moreList = onLoadMore(); UIUtils.runOnUiThread(new Runnable() { @Override public void run() { if (moreList == null) {// 如果没有拿到数据,说明加载失败 holder.setData(MoreHolder.TYPE_LOAD_ERROR); } else { // 每页返回20条数据,如果发现获取数据小于20条,说明已经没有更多数据了 if (moreList.size() < 20) { holder.setData(MoreHolder.TYPE_NO_MORE); } else { holder.setData(MoreHolder.TYPE_HAS_MORE); } // 将下一页的数据追加到当前集合当中 list.addAll(moreList); // 刷新当前listview notifyDataSetChanged(); } } }); } }); }
下载状态分析 ##
下载未开始
等待下载
正在下载
下载暂停
下载失败
下载成功
public static final int STATE_NONE = 0;// 下载未开始
public static final int STATE_WAITING = 1;// 等待下载
public static final int STATE_DOWNLOAD = 2;// 正在下载
public static final int STATE_PAUSE = 3;// 下载暂停
public static final int STATE_ERROR = 4;// 下载失败
public static final int STATE_SUCCESS = 5;// 下载成功
观察者模式 ##
/**
-
下载管理器-单例
* -
@author Kevin
*/
public class DownloadManager {public static final int STATE_NONE = 0;// 下载未开始 public static final int STATE_WAITING = 1;// 等待下载 public static final int STATE_DOWNLOAD = 2;// 正在下载 public static final int STATE_PAUSE = 3;// 下载暂停 public static final int STATE_ERROR = 4;// 下载失败 public static final int STATE_SUCCESS = 5;// 下载成功 private ArrayList<DownloadObserver> mObservers = new ArrayList<DownloadObserver>(); private static DownloadManager sInstance = new DownloadManager(); private DownloadManager() { } public static DownloadManager getInstance() { return sInstance; } // 2. 注册观察者 public void registerObserver(DownloadObserver observer) { if (observer != null && !mObservers.contains(observer)) { mObservers.add(observer); } } // 3. 注销观察者 public void unregisterObserver(DownloadObserver observer) { if (observer != null && mObservers.contains(observer)) { mObservers.remove(observer); } } // 4. 通知下载状态变化 public void notifyDownloadStateChanged() { for (DownloadObserver observer : mObservers) { observer.onDownloadStateChanged(); } } // 5. 通知下载进度变化 public void notifyDownloadProgressChanged() { for (DownloadObserver observer : mObservers) { observer.onDownloadProgressChanged(); } } /**
-
-
定义下载观察者接口
*/
public interface DownloadObserver {
// 下载状态发生变化
public void onDownloadStateChanged();// 下载进度发生变化 public void onDownloadProgressChanged();
}
}
-
下载对象封装 ##
/**
-
下载对象封装
* -
@author Kevin
*/
public class DownloadInfo {public String id;// apk唯一标识 public long size;// apk大小 public String downloadUrl;// 下载链接 public String name;// apk名称 public int currentState;// 当前下载状态 public long currentPos;// 当前下载位置 public String path;// apk下载在本地的路径 private static final String GOOGLEMARKET = "googlemarket";// 文件夹名称 private static final String DOWNLOAD = "download";// 子文件夹名称 // 获取当前下载进度 public float getProgress() { if (size == 0) { return 0; } return (float) currentPos / size; } /**
-
根据应用信息,拷贝出一个下载对象
*/
public static DownloadInfo copy(AppInfo appInfo) {
DownloadInfo info = new DownloadInfo();
info.id = appInfo.id;
info.size = appInfo.size;
info.downloadUrl = appInfo.downloadUrl;
info.name = appInfo.name;
info.currentState = DownloadManager.STATE_NONE;
info.currentPos = 0;
info.path = getFilePath(info.name);return info; } /**
-
获取apk文件的本地下载路径
*/
private static String getFilePath(String name) {
StringBuffer sb = new StringBuffer();
String sdcardPath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
sb.append(sdcardPath);
sb.append(File.separator);
sb.append(GOOGLEMARKET);
sb.append(File.separator);
sb.append(DOWNLOAD);if (createDir(sb.toString())) { return sb.toString() + File.separator + name + ".apk"; } return null; } // 创建文件夹 private static boolean createDir(String dirPath) { File dirFile = new File(dirPath); if (!dirFile.exists() || !dirFile.isDirectory()) { // 如果文件夹不存在,或者此文件不是一个文件夹,需要创建文件夹 return dirFile.mkdirs(); } return true;// 文件夹已经存在 }
}
开始下载 ##
/**
-
下载对象封装
* -
@author Kevin
*/
public class DownloadInfo {public String id;// apk唯一标识 public long size;// apk大小 public String downloadUrl;// 下载链接 public String name;// apk名称 public int currentState;// 当前下载状态 public long currentPos;// 当前下载位置 public String path;// apk下载在本地的路径 private static final String GOOGLEMARKET = "googlemarket";// 文件夹名称 private static final String DOWNLOAD = "download";// 子文件夹名称 // 获取当前下载进度 public float getProgress() { if (size == 0) { return 0; } return (float) currentPos / size; } /**
-
根据应用信息,拷贝出一个下载对象
*/
public static DownloadInfo copy(AppInfo appInfo) {
DownloadInfo info = new DownloadInfo();
info.id = appInfo.id;
info.size = appInfo.size;
info.downloadUrl = appInfo.downloadUrl;
info.name = appInfo.name;
info.currentState = DownloadManager.STATE_NONE;
info.currentPos = 0;
info.path = getFilePath(info.name);return info; } /**
-
获取apk文件的本地下载路径
*/
private static String getFilePath(String name) {
StringBuffer sb = new StringBuffer();
String sdcardPath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
sb.append(sdcardPath);
sb.append(File.separator);
sb.append(GOOGLEMARKET);
sb.append(File.separator);
sb.append(DOWNLOAD);if (createDir(sb.toString())) { return sb.toString() + File.separator + name + ".apk"; } return null; } // 创建文件夹 private static boolean createDir(String dirPath) { File dirFile = new File(dirPath); if (!dirFile.exists() || !dirFile.isDirectory()) { // 如果文件夹不存在,或者此文件不是一个文件夹,需要创建文件夹 return dirFile.mkdirs(); } return true;// 文件夹已经存在 }
}
下载暂停 ##
/**
-
下载暂停
*/
public synchronized void pause(AppInfo appInfo) {
if (appInfo != null) {
DownloadInfo downloadInfo = mDownloadInfoMap.get(appInfo.id);
if (downloadInfo != null) {
int state = downloadInfo.currentState;
// 如果当前状态是等待下载或者正在下载, 需要暂停当前任务
if (state == STATE_WAITING || state == STATE_DOWNLOAD) {
// 停止当前的下载任务
DownloadTask downloadTask = mDownloadTaskMap
.get(appInfo.id);
if (downloadTask != null) {
ThreadManager.getThreadPool().cancel(downloadTask);
}// 更新下载状态为暂停 downloadInfo.currentState = STATE_PAUSE; notifyDownloadStateChanged(downloadInfo); } } }
}
安装 ##
/**
- 安装apk
*/
public synchronized void install(AppInfo appInfo) {
DownloadInfo downloadInfo = mDownloadInfoMap.get(appInfo.id);
if (downloadInfo != null) {
// 跳到系统的安装页面进行安装
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse(“file://” + downloadInfo.path),
“application/vnd.android.package-archive”);
UIUtils.getContext().startActivity(intent);
}
}
下载过程 ##
/**
-
下载任务
*/
class DownloadTask implements Runnable {private DownloadInfo downloadInfo; private HttpResult httpResult; public DownloadTask(DownloadInfo downloadInfo) { this.downloadInfo = downloadInfo; } @Override public void run() { // 更新下载状态 downloadInfo.currentState = STATE_DOWNLOAD; notifyDownloadStateChanged(downloadInfo); File file = new File(downloadInfo.path); if (!file.exists() || file.length() != downloadInfo.currentPos || downloadInfo.currentPos == 0) {// 文件不存在, 或者文件长度和对象的长度不一致, // 或者对象当前下载位置是0 file.delete();// 移除无效文件 downloadInfo.currentPos = 0;// 文件当前位置归零 httpResult = HttpHelper.download(HttpHelper.URL
“download?name=” + downloadInfo.downloadUrl);// 从头开始下载文件
} else {
// 需要断点续传
httpResult = HttpHelper.download(HttpHelper.URL
“download?name=” + downloadInfo.downloadUrl
“&range=” + file.length());
}
InputStream in = null;
FileOutputStream out = null;
if (httpResult != null
&& (in = httpResult.getInputStream()) != null) {
try {
out = new FileOutputStream(file, true);//在源文件基础上追加
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1
&& downloadInfo.currentState == STATE_DOWNLOAD) {// 只有在下载的状态才读取文件,如果状态变化,就立即停止读写文件
out.write(buffer, 0, len);
out.flush();
downloadInfo.currentPos += len;// 更新当前文件下载位置
notifyDownloadProgressChanged(downloadInfo);// 通知进度更新
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.close(in);
IOUtils.close(out);
}
// 下载结束, 判断文件是否完整
if (file.length() == downloadInfo.size) {
// 下载完毕
downloadInfo.currentState = STATE_SUCCESS;
notifyDownloadStateChanged(downloadInfo);
} else if (downloadInfo.currentState == STATE_PAUSE) {
// 中途暂停
notifyDownloadStateChanged(downloadInfo);
} else {
// 下载失败
downloadInfo.currentState = STATE_ERROR;
downloadInfo.currentPos = 0;
notifyDownloadStateChanged(downloadInfo);
// 删除无效文件
file.delete();
}
} else {
// 下载失败
downloadInfo.currentState = STATE_ERROR;
downloadInfo.currentPos = 0;
notifyDownloadStateChanged(downloadInfo);
// 删除无效文件
file.delete();
}
// 不管下载成功,失败还是暂停, 下载任务已经结束,都需要从当前任务集合中移除
mDownloadTaskMap.remove(downloadInfo.id);
}
}
应用详情页下载状态更新 ##
初始化自定义进度条
// 添加进度条布局
pbProgress = new ProgressHorizontal(UIUtils.getContext());
pbProgress.setProgressTextColor(Color.WHITE);// 文字颜色为白色
pbProgress.setProgressTextSize(UIUtils.dip2px(18));// 文字大小
pbProgress.setProgressResource(R.drawable.progress_normal);// 进度条颜色
pbProgress.setProgressBackgroundResource(R.drawable.progress_bg);// 进度条背景色
// 初始化布局参数
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
flDownload.addView(pbProgress, params);
初始化下载状态
@Override
public void refreshView(AppInfo data) {
mAppInfo = data;
mDownloadManager = DownloadManager.getInstance();
// 监听下载进度
mDownloadManager.registerObserver(this);
DownloadInfo downloadInfo = mDownloadManager.getDownloadInfo(data);
if (downloadInfo == null) {
// 没有下载过
mCurrentState = DownloadManager.STATE_NONE;
mProgress = 0;
} else {
// 之前下载过, 以内存中的对象的状态为准
mCurrentState = downloadInfo.currentState;
mProgress = downloadInfo.getProgress();
}
//根据对象状态刷新界面
refreshUI(mProgress, mCurrentState);
}
根据下载状态刷新界面
/**
-
刷新界面
*/
private void refreshUI(float progress, int state) {
mCurrentState = state;
mProgress = progress;
switch (state) {
case DownloadManager.STATE_NONE:
flDownload.setVisibility(View.GONE);
btnDownload.setText(UIUtils.getString(R.string.app_state_download));
break;
case DownloadManager.STATE_WAITING:
flDownload.setVisibility(View.GONE);
btnDownload.setText(UIUtils.getString(R.string.app_state_waiting));
break;
case DownloadManager.STATE_DOWNLOAD:
flDownload.setVisibility(View.VISIBLE);
pbProgress.setProgress(progress);
pbProgress.setCenterText("");
break;
case DownloadManager.STATE_PAUSE:
flDownload.setVisibility(View.VISIBLE);
pbProgress.setCenterText(UIUtils
.getString(R.string.app_state_paused));
break;
case DownloadManager.STATE_ERROR:
flDownload.setVisibility(View.GONE);
btnDownload.setText(UIUtils.getString(R.string.app_state_error));
break;
case DownloadManager.STATE_SUCCESS:
flDownload.setVisibility(View.GONE);
btnDownload.setText(UIUtils
.getString(R.string.app_state_downloaded));
break;default: break; } }
监听下载状态和进度变化
@Override
public void onDownloadStateChanged(DownloadInfo info) {
refreshOnMainThread(info);
}
@Override
public void onDownloadProgressChanged(DownloadInfo info) {
refreshOnMainThread(info);
}
// 主线程刷新ui
private void refreshOnMainThread(final DownloadInfo info) {
// 判断要刷新的下载对象是否是当前的应用
if (info.id.equals(mAppInfo.id)) {
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
refreshUI(info.getProgress(), info.currentState);
}
});
}
}
下载按钮事件处理
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_download:
case R.id.fl_download:
// 根据当前状态来决定相关操作
if (mCurrentState == DownloadManager.STATE_NONE
|| mCurrentState == DownloadManager.STATE_PAUSE
|| mCurrentState == DownloadManager.STATE_ERROR) {
// 开始下载
mDownloadManager.download(mAppInfo);
} else if (mCurrentState == DownloadManager.STATE_DOWNLOAD
|| mCurrentState == DownloadManager.STATE_WAITING) {
// 暂停下载
mDownloadManager.pause(mAppInfo);
} else if (mCurrentState == DownloadManager.STATE_SUCCESS) {
// 开始安装
mDownloadManager.install(mAppInfo);
}
break;
default:
break;
}
}
首页下载状态更新 #
和应用详情页逻辑基本一致
初始化圆形自定义进度条
//初始化圆形进度条
pbProgress = new ProgressArc(UIUtils.getContext());
//设置圆形进度条直径
pbProgress.setArcDiameter(UIUtils.dip2px(26));
//设置进度条颜色
pbProgress.setProgressColor(UIUtils.getColor(R.color.progress));
//设置进度条宽高布局参数
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
UIUtils.dip2px(27), UIUtils.dip2px(27));
flDownload.addView(pbProgress, params);
flDownload.setOnClickListener(this);
初始化下载状态
mDownloadManager = DownloadManager.getInstance();
// 监听下载进度
mDownloadManager.registerObserver(this);
DownloadInfo downloadInfo = mDownloadManager.getDownloadInfo(data);
if (downloadInfo == null) {
// 没有下载过
mCurrentState = DownloadManager.STATE_NONE;
mProgress = 0;
} else {
// 之前下载过, 以内存中的对象的状态为准
mCurrentState = downloadInfo.currentState;
mProgress = downloadInfo.getProgress();
}
refreshUI(mProgress, mCurrentState);
根据下载状态刷新界面
/**
-
刷新界面
* -
@param progress
-
@param state
*/
private void refreshUI(float progress, int state) {
mCurrentState = state;
mProgress = progress;
switch (state) {
case DownloadManager.STATE_NONE:
pbProgress.setBackgroundResource(R.drawable.ic_download);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
tvDownload.setText(UIUtils.getString(R.string.app_state_download));
break;
case DownloadManager.STATE_WAITING:
pbProgress.setBackgroundResource(R.drawable.ic_download);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_WAITING);
tvDownload.setText(UIUtils.getString(R.string.app_state_waiting));
break;
case DownloadManager.STATE_DOWNLOAD:
pbProgress.setBackgroundResource(R.drawable.ic_pause);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_DOWNLOADING);
pbProgress.setProgress(progress, true);
tvDownload.setText((int) (progress * 100) + “%”);
break;
case DownloadManager.STATE_PAUSE:
pbProgress.setBackgroundResource(R.drawable.ic_resume);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
flDownload.setVisibility(View.VISIBLE);
break;
case DownloadManager.STATE_ERROR:
pbProgress.setBackgroundResource(R.drawable.ic_redownload);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
tvDownload.setText(UIUtils.getString(R.string.app_state_error));
break;
case DownloadManager.STATE_SUCCESS:
pbProgress.setBackgroundResource(R.drawable.ic_install);
pbProgress.setStyle(ProgressArc.PROGRESS_STYLE_NO_PROGRESS);
tvDownload
.setText(UIUtils.getString(R.string.app_state_downloaded));
break;default: break; } }
监听下载状态和进度变化
@Override
public void onDownloadStateChanged(DownloadInfo info) {
refreshOnMainThread(info);
}
@Override
public void onDownloadProgressChanged(DownloadInfo info) {
refreshOnMainThread(info);
}
// 主线程刷新ui
private void refreshOnMainThread(final DownloadInfo info) {
// 判断要刷新的下载对象是否是当前的应用
if (info.id.equals(mAppInfo.id)) {
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
refreshUI(info.getProgress(), info.currentState);
}
});
}
}
下载按钮事件处理
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fl_download:
// 根据当前状态来决定相关操作
if (mCurrentState == DownloadManager.STATE_NONE
|| mCurrentState == DownloadManager.STATE_PAUSE
|| mCurrentState == DownloadManager.STATE_ERROR) {
// 开始下载
mDownloadManager.download(mAppInfo);
} else if (mCurrentState == DownloadManager.STATE_DOWNLOAD
|| mCurrentState == DownloadManager.STATE_WAITING) {
// 暂停下载
mDownloadManager.pause(mAppInfo);
} else if (mCurrentState == DownloadManager.STATE_SUCCESS) {
// 开始安装
mDownloadManager.install(mAppInfo);
}
break;
default:
break;
}
}
ActionBar简介 ##
DrawerLayout
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.itcast.googleplayteach.ui.PagerTab
android:id="@+id/pager_tab"
android:layout_width="match_parent"
android:layout_height="42dp"
android:background="@drawable/bg_tab" />
<android.support.v4.view.ViewPager
android:id="@+id/vp_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<FrameLayout
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="#000" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是侧边栏"
android:textColor="#fff" />
</FrameLayout>
</android.support.v4.widget.DrawerLayout>
初始化ActionBar
/**
-
初始化actionbar
*/
private void initActionBar() {
// 获取actionbar对象
ActionBar actionBar = getSupportActionBar();
// 左上角显示logo
actionBar.setHomeButtonEnabled(true);
// 左上角显示返回图标, 和侧边栏绑定后显示侧边栏图标
actionBar.setDisplayHomeAsUpEnabled(true);// 初始化侧边栏开关 mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer_am, R.string.drawer_open, R.string.drawer_close);// 参2:DrawerLayout对象, 参3:侧边栏开关图标, // 参4:打开侧边栏文本描述;参5:关闭侧边栏文本描述 // 调用当前同步方法,才可以将侧拉菜单和按钮的点击操作绑定起来 mToggle.syncState(); }
点击打开或关闭侧边栏
// ActionBar上的按钮被点击后的回调方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:// 左上角logo处被点击
mToggle.onOptionsItemSelected(item);//侧边栏收起或者关闭
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
应用详情页面ActionBar
/**
-
初始化actionbar
*/
private void initActionBar() {
// 获取actionbar对象
ActionBar actionBar = getSupportActionBar();
// 左上角显示logo
actionBar.setHomeButtonEnabled(true);
// 左上角显示返回图标
actionBar.setDisplayHomeAsUpEnabled(true);
}@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home:// 左上角logo处被点击 finish(); break; default: break; } return super.onOptionsItemSelected(item); }