package com.dl7.mvp.module.home; import android.Manifest; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.util.SparseArray; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.Toast; import com.dl7.downloaderlib.FileDownloader; import com.dl7.mvp.R; import com.dl7.mvp.module.base.BaseActivity; import com.dl7.mvp.module.manage.setting.SettingsActivity; import com.dl7.mvp.module.news.main.NewsMainFragment; import com.dl7.mvp.module.photo.main.PhotoMainFragment; import com.dl7.mvp.module.video.main.VideoMainFragment; import com.dl7.mvp.utils.SnackbarUtils; import com.tbruyelle.rxpermissions.RxPermissions; import java.io.File; import butterknife.BindView; import rx.functions.Action1; /** * 程序入口 */ public class HomeActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener { @BindView(R.id.fl_container) FrameLayout mFlContainer; @BindView(R.id.nav_view) NavigationView mNavView; @BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout; // 本来想用这个来存储Fragment做切换,不过貌似fragment会被回收产生异常,估计内存占用太大 // private SparseArray<Fragment> mSparseFragments = new SparseArray<>(); private SparseArray<String> mSparseTags = new SparseArray<>(); private long mExitTime = 0; private int mItemId = -1; private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case R.id.nav_news: replaceFragment(R.id.fl_container, new NewsMainFragment(), mSparseTags.get(R.id.nav_news)); break; case R.id.nav_photos: replaceFragment(R.id.fl_container, new PhotoMainFragment(), mSparseTags.get(R.id.nav_photos)); break; case R.id.nav_videos: replaceFragment(R.id.fl_container, new VideoMainFragment(), mSparseTags.get(R.id.nav_videos)); break; case R.id.nav_setting: SettingsActivity.launch(HomeActivity.this); break; } mItemId = -1; return true; } }); @Override protected int attachLayoutRes() { return R.layout.activity_home; } @Override protected void initInjector() { } @Override protected void initViews() { _initDrawerLayout(mDrawerLayout, mNavView); mSparseTags.put(R.id.nav_news, "News"); mSparseTags.put(R.id.nav_photos, "Photos"); mSparseTags.put(R.id.nav_videos, "Videos"); _getPermission(); } @Override protected void updateViews(boolean isRefresh) { mNavView.setCheckedItem(R.id.nav_news); addFragment(R.id.fl_container, new NewsMainFragment(), "News"); } @Override public boolean onNavigationItemSelected(@NonNull final MenuItem item) { mDrawerLayout.closeDrawer(GravityCompat.START); if (item.isChecked()) { return true; } mItemId = item.getItemId(); return true; } @Override public void onBackPressed() { // 获取堆栈里有几个 final int stackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else if (stackEntryCount == 1) { // 如果剩一个说明在主页,提示按两次退出app _exit(); } else { // 获取上一个堆栈中保存的是哪个页面,根据name来设置导航项的选中状态 final String tagName = getSupportFragmentManager().getBackStackEntryAt(stackEntryCount - 2).getName(); int index = mSparseTags.indexOfValue(tagName); mNavView.setCheckedItem(mSparseTags.keyAt(index)); super.onBackPressed(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { mDrawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } /** * 初始化 DrawerLayout * * @param drawerLayout DrawerLayout * @param navView NavigationView */ private void _initDrawerLayout(DrawerLayout drawerLayout, NavigationView navView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); //将侧边栏顶部延伸至status bar drawerLayout.setFitsSystemWindows(true); //将主页面顶部延伸至status bar drawerLayout.setClipToPadding(false); } drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerClosed(View drawerView) { mHandler.sendEmptyMessage(mItemId); } }); navView.setNavigationItemSelectedListener(this); } private void _getPermission() { new RxPermissions(this).request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { final File dir = new File(FileDownloader.getDownloadDir()); if (!dir.exists() || !dir.isDirectory()) { dir.delete(); dir.mkdirs(); } } else { SnackbarUtils.showSnackbar(HomeActivity.this, "获取读写文件权限失败", true); } } }); } /** * 退出 */ private void _exit() { if (System.currentTimeMillis() - mExitTime > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { finish(); } } }