package com.xiaweizi.qnews.activity; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.support.annotation.IdRes; import android.support.design.widget.BottomSheetDialog; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.blankj.utilcode.utils.FileUtils; import com.blankj.utilcode.utils.LogUtils; import com.blankj.utilcode.utils.SPUtils; import com.bumptech.glide.Glide; import com.roughike.bottombar.BottomBar; import com.roughike.bottombar.OnTabReselectListener; import com.roughike.bottombar.OnTabSelectListener; import com.xiaweizi.qnews.R; import com.xiaweizi.qnews.commons.ActivityUtils; import com.xiaweizi.qnews.commons.VersionUtils; import com.xiaweizi.qnews.fragment.AboutFragment; import com.xiaweizi.qnews.fragment.GIFFragment; import com.xiaweizi.qnews.fragment.JokeFragment; import com.xiaweizi.qnews.fragment.NewsFragment; import com.xiaweizi.qnews.fragment.RobotFragment; import com.xiaweizi.qnews.fragment.TodayFragment; import com.zhy.http.okhttp.OkHttpUtils; import com.zhy.http.okhttp.callback.StringCallback; import java.io.File; import java.lang.ref.WeakReference; import butterknife.BindView; import butterknife.ButterKnife; import okhttp3.Call; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity------>"; @BindView (R.id.fl_content) FrameLayout flContent; @BindView (R.id.nv_left) NavigationView nvLeft; @BindView (R.id.dl_activity_main) DrawerLayout dlActivityMain; private FragmentManager manager; private FragmentTransaction transaction; private NewsFragment newsFragment; //新闻数据 private JokeFragment jokeFragment; //段子 private RobotFragment robotFragment; //机器人 private AboutFragment aboutFragment; //关于 private TodayFragment todayFragment; //历史上的今天 private GIFFragment gifFragment; //动态图 private Fragment currentFragment; private ActivityUtils utils; private BottomBar bottomBar; private AlertDialog.Builder builder; private SPUtils mSPUtils; public static final String FILE_PATH = "file://" + Environment.getExternalStorageDirectory().getPath() + "/xiaweizi" + "/image_cache" + "/camera.jpg"; public static final String TEMP_PATH = Environment.getExternalStorageDirectory().getPath() + "/xiaweizi" + "/image_cache" + "/camera.jpg"; public static final int SUCESS = 0; public static final int FAILED = 1; private ImageView mIconImage; private BottomSheetDialog mDialog; private MyHandler mHandler; private String mDirSize = ""; class MyHandler extends Handler { WeakReference<MainActivity> mActivity; MyHandler(MainActivity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { MainActivity theActivity = mActivity.get(); if (theActivity == null || theActivity.isFinishing()) { return; } // 消息处理 switch (msg.what) { case SUCESS: utils.showToast("清理成功"); break; case FAILED: break; default: break; } } } ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SPUtils util = new SPUtils("theme_id"); int theme_id = util.getInt("theme_id", R.style.AppTheme); setTheme(theme_id); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } //设置软键盘的模式为适应屏幕模式 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); setContentView(R.layout.activity_main); retrieveFragment(); ButterKnife.bind(this); utils = new ActivityUtils(this); mSPUtils = new SPUtils("head"); mHandler = new MyHandler(this); new Thread(new Runnable() { @Override public void run() { mDirSize = FileUtils.getDirSize(getCacheDir()); } }).start(); /*************************** 左侧 侧滑菜单 设置头像图片 ***************************/ mIconImage = (ImageView) nvLeft.getHeaderView(0).findViewById(R.id.icon_image); final ImageView ivBmp = (ImageView) nvLeft.getHeaderView(0).findViewById(R.id.iv_head_bg); if (!mSPUtils.getBoolean("has_head", false)) { Glide.with(this) .load("http://img.17gexing.com/uploadfile/2016/07/2/20160725115642623.gif") .asGif() .centerCrop() .into(mIconImage); } else { mIconImage.setImageBitmap(BitmapFactory.decodeFile(TEMP_PATH)); } OkHttpUtils.get() .url("http://guolin.tech/api/bing_pic") .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { } @Override public void onResponse(String response, int id) { Glide.with(MainActivity.this) .load(response) .crossFade() .centerCrop() .into(ivBmp); } }); mIconImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDialog = new BottomSheetDialog(MainActivity.this); View view = View.inflate(MainActivity.this, R.layout.bottom_dialog_pic_selector, null); TextView xiangji = (TextView) view.findViewById(R.id.tv_xiangji); TextView xiangce = (TextView) view.findViewById(R.id.tv_xiangce); xiangce.setOnClickListener(listener); xiangji.setOnClickListener(listener); mDialog.setContentView(view); mDialog.setCancelable(true); mDialog.setCanceledOnTouchOutside(true); mDialog.show(); } }); /*************************** 底部bar 设置点击事件 ***************************/ bottomBar = (BottomBar) findViewById(R.id.bottomBar); bottomBar.setOnTabSelectListener(new OnTabSelectListener() { @Override public void onTabSelected(@IdRes int tabId) { switch (tabId) { case R.id.tab_news: LogUtils.i("setOnTabSelectListener"); if (newsFragment == null) newsFragment = new NewsFragment(); switchFragment(newsFragment); nvLeft.setCheckedItem(R.id.nav_news); closeDrawerLayout(); break; case R.id.tab_joke: nvLeft.setCheckedItem(R.id.nav_duanzi); if (jokeFragment == null) jokeFragment = new JokeFragment(); switchFragment(jokeFragment); closeDrawerLayout(); break; case R.id.tab_today: nvLeft.setCheckedItem(R.id.nav_today_of_history); if (todayFragment == null) todayFragment = new TodayFragment(); switchFragment(todayFragment); closeDrawerLayout(); break; case R.id.tab_robot: nvLeft.setCheckedItem(R.id.nav_robot); if (robotFragment == null) robotFragment = new RobotFragment(); switchFragment(robotFragment); closeDrawerLayout(); break; case R.id.tab_about: nvLeft.setCheckedItem(R.id.nav_other); if (aboutFragment == null) aboutFragment = new AboutFragment(); switchFragment(aboutFragment); closeDrawerLayout(); break; } } }); //底部bar设置再次点击事件 bottomBar.setOnTabReselectListener(new OnTabReselectListener() { @Override public void onTabReSelected(@IdRes int tabId) { switch (tabId) { case R.id.tab_news: break; case R.id.tab_joke: if (gifFragment == null) gifFragment = new GIFFragment(); switchFragment(gifFragment); break; case R.id.tab_robot: break; } } }); /*************************** 左侧 侧滑菜单 设置选择事件 ***************************/ nvLeft.setCheckedItem(R.id.nav_news); nvLeft.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { nvLeft.setCheckedItem(item.getItemId()); dlActivityMain.closeDrawers(); switch (item.getItemId()) { case R.id.nav_news: bottomBar.selectTabAtPosition(0, true); break; case R.id.nav_duanzi: bottomBar.selectTabAtPosition(1, true); break; case R.id.nav_today_of_history: bottomBar.selectTabAtPosition(2, true); break; case R.id.nav_robot: bottomBar.selectTabAtPosition(3, true); break; case R.id.nav_other: bottomBar.selectTabAtPosition(4, true); break; case R.id.nav_clear_cache: clearCache(); break; case R.id.nav_version_update: VersionUtils.updateVersion(MainActivity.this); break; case R.id.nav_change_theme: alertChangeTheme(); break; case R.id.nav_day_night: changeTheme(9); break; default: break; } return false; } }); } /** * 切换Fragment的显示 * * @param target 要切换的 Fragment */ private void switchFragment(Fragment target) { // 如果当前的fragment 就是要替换的fragment 就直接return if (currentFragment == target) return; // 获得 Fragment 事务 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // 如果当前Fragment不为空,则隐藏当前的Fragment if (currentFragment != null) { transaction.hide(currentFragment); } // 如果要显示的Fragment 已经添加了,那么直接 show if (target.isAdded()) { transaction.show(target); } else { // 如果要显示的Fragment没有添加,就添加进去 transaction.add(R.id.fl_content, target, target.getClass().getName()); } // 事务进行提交 transaction.commit(); //并将要显示的Fragment 设为当前的 Fragment currentFragment = target; } /** * 找回FragmentManager中存储的Fragment */ private void retrieveFragment() { FragmentManager manager = getSupportFragmentManager(); newsFragment = (NewsFragment) manager.findFragmentByTag("NewsFragment"); jokeFragment = (JokeFragment) manager.findFragmentByTag("JokeFragment"); todayFragment = (TodayFragment) manager.findFragmentByTag("TodayFragment"); robotFragment = (RobotFragment) manager.findFragmentByTag("RobotFragment"); aboutFragment = (AboutFragment) manager.findFragmentByTag("AboutFragment"); gifFragment = (GIFFragment) manager.findFragmentByTag("GifFragment"); } /** * 关闭左侧 侧滑菜单 */ private void closeDrawerLayout() { if (dlActivityMain.isDrawerOpen(Gravity.LEFT)) { dlActivityMain.closeDrawers(); } } long lastTime = 0; /** * 2秒内连续点击 back 键,退出应用 */ @Override public void onBackPressed() { // 判断侧滑菜单是否开启,如果开启则先关闭 if (dlActivityMain.isDrawerOpen(Gravity.LEFT)) { dlActivityMain.closeDrawers(); return; } // 判断当前fragment 是不是 新闻fragment,如果不是先退到新闻fragment if (currentFragment != newsFragment) { bottomBar.selectTabAtPosition(0); return; } long curTime = System.currentTimeMillis(); if ((curTime - lastTime) > 2000) { utils.showToast("再按一次退出应用"); lastTime = curTime; } else { moveTaskToBack(true); } } private void clearCache() { new AlertDialog.Builder(MainActivity.this).setTitle("确定要清理缓存") .setMessage("缓存大小:" + mDirSize) .setPositiveButton("清理", new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { new Thread(new Runnable() { @Override public void run() { FileUtils.deleteDir( getCacheDir()); mHandler.sendEmptyMessage( SUCESS); } }).start(); } }) .setNegativeButton("取消", null) .show(); } private void changeTheme(int index) { int[] themes = new int[]{R.style.AppTheme, R.style.AppTheme_Blue, R.style.AppTheme_Green, R.style.AppTheme_Orange, R.style.AppTheme_Pink, R.style.AppTheme_Sky, R.style.AppTheme_Purple, R.style.AppTheme_PP, R.style.AppTheme_Yellow, R.style.AppTheme_Night}; SPUtils utils = new SPUtils("theme_id"); utils.putInt("theme_id", themes[index]); Intent intent = getIntent(); overridePendingTransition(0, 0); finish(); overridePendingTransition(0, 0); startActivity(intent); } /** * 动态换肤 */ private void alertChangeTheme() { View view = View.inflate(this, R.layout.item_change_theme, null); builder = new AlertDialog.Builder(this).setView(view); builder.show(); view.findViewById(R.id.tv_red).setOnClickListener(listener); view.findViewById(R.id.tv_green).setOnClickListener(listener); view.findViewById(R.id.tv_blue).setOnClickListener(listener); view.findViewById(R.id.tv_orange).setOnClickListener(listener); view.findViewById(R.id.tv_pink).setOnClickListener(listener); view.findViewById(R.id.tv_sky).setOnClickListener(listener); view.findViewById(R.id.tv_purple).setOnClickListener(listener); view.findViewById(R.id.tv_pp).setOnClickListener(listener); view.findViewById(R.id.tv_yellow).setOnClickListener(listener); } private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_red: changeTheme(0); break; case R.id.tv_blue: changeTheme(1); break; case R.id.tv_green: changeTheme(2); break; case R.id.tv_orange: changeTheme(3); break; case R.id.tv_pink: changeTheme(4); break; case R.id.tv_sky: changeTheme(5); break; case R.id.tv_purple: changeTheme(6); break; case R.id.tv_pp: changeTheme(7); break; case R.id.tv_yellow: changeTheme(8); break; case R.id.tv_xiangji: //相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片存储路径 Uri imageUri = Uri.parse(FILE_PATH); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, 1000); break; case R.id.tv_xiangce: //相册 intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, 1001); break; default: break; } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_CANCELED) { switch (requestCode) { case 1000: File temp = new File(TEMP_PATH); startPhotoZoom(Uri.fromFile(temp)); break; case 1001: File temp1 = new File(TEMP_PATH); startPhotoZoom(Uri.fromFile(temp1)); break; case 1002: if (data != null) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap bmp = extras.getParcelable("data"); Log.i("--->", "onActivityResult: "); mIconImage.setImageBitmap(bmp); mSPUtils.putBoolean("has_head", true); if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } } } default: break; } } } private void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop 为true 是设置在开启的intent中设置显示的view可以裁剪 intent.putExtra("crop", "true"); // aspect 是宽高比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // output 是裁剪图片的宽高 intent.putExtra("outputX", 100); intent.putExtra("outputY", 100); intent.putExtra("return-data", true); intent.putExtra("noFaceDetection", true); startActivityForResult(intent, 1002); } }