提交 a3d8159b 编写于 作者: Black_Hao's avatar Black_Hao

Add BaseActivity BaseFragment Logutil

Add BaseActivity BaseFragment Logutil
上级 6561ff9d
......@@ -21,7 +21,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<activity android:name=".base.TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
......@@ -29,6 +29,7 @@
</intent-filter>
</activity>
<activity android:name=".usbUtil.UsbTestActivity"/>
<!--<activity android:name=".base.TestActivity" />-->
</application>
</manifest>
\ No newline at end of file
package com.balckhao.blackhaoutil.base;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import com.balckhao.blackhaoutil.logUtil.LogUtil;
import java.lang.ref.WeakReference;
/**
* Author : 章浩
* Time : 2018/6/20 16:38
* Description : 教育一体机 BaseActivity
*/
public abstract class BaseActivity extends AppCompatActivity {
//Handler
public WeakHandler handler;
//Toast 间隔时间
private static long TOAST_INTERVALS = 1000;
//Toast上次显示时间(避免短时间内多次调用)
private long showToastTime = 0;
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
protected LogUtil log;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//定义全屏参数
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
//获得当前窗体对象
Window window = this.getWindow();
//设置当前窗体为全屏显示
window.setFlags(flag, flag);
//初始化Log
log = LogUtil.getInstance();
//初始化fragmentArray
fragmentArray = new SparseArray<>();
//初始化UI
initUI();
//view 初始化完成
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
//初始化数据
initData();
//添加listener
initListener();
}
});
}
/**
* 初始化UI
*/
protected abstract void initUI();
/**
* UI初始化完成,初始化数据
*/
protected abstract void initData();
/**
* UI初始化完成,初始化接口
*/
protected abstract void initListener();
/**
* 子类要处理 handler的消息,重写该方法
*/
protected abstract void handleMessage(Message msg);
/**
* 初始化 Handler(不用 handler 时,不需要调用该方法)
*/
public void initHandler() {
handler = new WeakHandler(this);
}
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//避免多次调用
if (System.currentTimeMillis() - showToastTime > TOAST_INTERVALS) {
Toast.makeText(BaseActivity.this, str, Toast.LENGTH_SHORT).show();
//更新显示时间
showToastTime = System.currentTimeMillis();
}
}
});
}
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(int strId) {
showToast(getString(strId));
}
/**
* 替换 fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//用于fragment的显示与隐藏
if (currentFragment != null && currentFragment != showFragment) {
if (!showFragment.isAdded()) { // 先判断是否被add过
transaction.hide(currentFragment).add(frameId, showFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.hide(currentFragment).show(showFragment).commit(); // 隐藏当前的fragment,显示下一个
}
fragmentArray.put(frameId, showFragment);
} else if (currentFragment == null) {
if (!showFragment.isAdded()) { // 先判断是否被add过
transaction.add(frameId, showFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.show(showFragment).commit(); // 隐藏当前的fragment,显示下一个
}
fragmentArray.put(frameId, showFragment);
}
}
/**
* activity 跳转
*
* @param target 需要跳转的 Activity
* @param bundle bundle
* @param isCloseSelf 是否关闭当前的 activity
*/
public void openActivity(Class<?> target, Bundle bundle, boolean isCloseSelf) {
Intent intent = new Intent(this, target);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
if (isCloseSelf) {
finish();
}
}
/**
* activity 跳转(不需要传值)
*
* @param target 需要跳转的Activity
*/
public void openActivity(Class<?> target) {
openActivity(target, null, false);
}
/**
* 弱引用 handler
*/
public static class WeakHandler extends Handler {
WeakReference weakReference;
WeakHandler(BaseActivity activity) {
this.weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
BaseActivity activity = (BaseActivity) weakReference.get();
switch (msg.what) {
default:
if (activity != null) {
activity.handleMessage(msg);
}
break;
}
}
}
}
package com.balckhao.blackhaoutil.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.balckhao.blackhaoutil.logUtil.LogUtil;
/**
* Author : BlackHao
* Time : 2018/6/20 14:55
* Description : 教育一体机 BaseFragment
*/
public abstract class BaseFragment extends Fragment {
//对应的activity
protected BaseActivity baseActivity;
//用于保存对应FrameLayout当前显示的Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
protected LogUtil log;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
baseActivity = (BaseActivity) getActivity();
fragmentArray = new SparseArray<>();
log = baseActivity.log;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(initLayoutRes(), container, false);
initUI(view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initData();
initListener();
}
/**
* 用于返回布局文件ID
*/
protected abstract int initLayoutRes();
/**
* UI初始化
*/
protected abstract void initUI(View view);
/**
* UI初始化完成,初始化数据
*/
protected abstract void initData();
/**
* UI初始化完成,初始化接口
*/
protected abstract void initListener();
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(String str) {
baseActivity.showToast(str);
}
/**
* 显示Toast(可以在子线程中调用)
*/
public void showToast(int strId) {
baseActivity.showToast(strId);
}
/**
* 替换fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//用于fragment的显示与隐藏
if (currentFragment != null && currentFragment != showFragment) {
// 先判断是否被add过
if (!showFragment.isAdded()) {
// 隐藏当前的fragment,add下一个到Activity中
transaction.hide(currentFragment).add(frameId, showFragment).commit();
} else {
// 隐藏当前的fragment,显示下一个
transaction.hide(currentFragment).show(showFragment).commit();
}
fragmentArray.put(frameId, showFragment);
} else if (currentFragment == null) {
// 先判断是否被add过
if (!showFragment.isAdded()) {
// 隐藏当前的fragment,add下一个到Activity中
transaction.add(frameId, showFragment).commit();
} else {
// 隐藏当前的fragment,显示下一个
transaction.show(showFragment).commit();
}
fragmentArray.put(frameId, showFragment);
}
}
/**
* activity 跳转
*
* @param target 需要跳转的Activity
* @param bundle bundle
* @param isCloseSelf 是否关闭当前的activity
*/
public void openActivity(Class<?> target, Bundle bundle, boolean isCloseSelf) {
baseActivity.openActivity(target, bundle, isCloseSelf);
}
/**
* activity 跳转(不需要传值)
*
* @param target 需要跳转的 Activity
*/
public void openActivity(Class<?> target) {
openActivity(target, null, false);
}
}
package com.balckhao.blackhaoutil.base;
import android.os.Message;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Author : BlackHao
* Time : 2018/8/1 10:35
* Description : BaseActivity LogUtil Test
*/
public class TestActivity extends BaseActivity {
@Bind(R.id.tv_show_time)
TextView tvShowTime;
private String testJson1 = "{\"UserID\":01, \"Name\":\"Test\", \"Email\":\"test@gmail.com\"};";
@Override
protected void initUI() {
setContentView(R.layout.activity_base_test);
ButterKnife.bind(this);
replaceFragment(R.id.frame_1, new TestFragment());
replaceFragment(R.id.frame_2, new TestFragment());
}
@Override
protected void initData() {
//初始化Handler
initHandler();
handler.sendEmptyMessageDelayed(0, 1000);
log.json(testJson1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 2048; i++) {
sb.append(i).append(" ");
if (i + 1 % 100 == 0) {
sb.append("\n");
}
}
log.e(sb.toString());
}
@Override
protected void initListener() {
}
@Override
protected void handleMessage(Message msg) {
switch (msg.what) {
case 0:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
String time = df.format(new Date());
tvShowTime.setText(time);
handler.sendEmptyMessageDelayed(0, 1000);
break;
}
}
}
package com.balckhao.blackhaoutil.base;
import android.view.View;
import android.widget.ImageView;
import com.balckhao.blackhaoutil.R;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Author : BlackHao
* Time : 2018/8/1 10:42
* Description :
*/
public class TestFragment extends BaseFragment {
@Bind(R.id.iv_1)
ImageView iv1;
@Override
protected int initLayoutRes() {
return R.layout.fragment_one;
}
@Override
protected void initUI(View view) {
ButterKnife.bind(this, view);
iv1.setImageResource(R.mipmap.ic_launcher);
}
@Override
protected void initData() {
}
@Override
protected void initListener() {
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
}
package com.balckhao.blackhaoutil.logUtil;
import android.util.Log;
/**
* Author : BlackHao
* Time : 2017/8/1 14:05
* Description : Log 工具类 ,支持跳转对应的代码位置
*/
public class LogUtil {
//单例
private static LogUtil logUtil;
//打印调试开关
private static boolean IS_DEBUG = true;
//Log 单词打印的最大长度
private static final int MAX_LENGTH = 3 * 1024;
//单例模式初始化
public static LogUtil getInstance() {
if (logUtil == null) {
logUtil = new LogUtil();
}
return logUtil;
}
/**
* 获取 TAG 信息:文件名以及行数
*
* @return TAG 信息
*/
private synchronized String getTAG() {
StringBuilder tag = new StringBuilder();
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
if (sts == null) {
return "";
}
for (StackTraceElement st : sts) {
//筛选获取需要打印的TAG
if (!st.isNativeMethod() && !st.getClassName().equals(Thread.class.getName()) && !st.getClassName().equals(this.getClass().getName())) {
//获取文件名以及打印的行数
tag.append("(").append(st.getFileName()).append(":").append(st.getLineNumber()).append(")");
return tag.toString();
}
}
return "";
}
/**
* Log.e 打印
*
* @param text 需要打印的内容
*/
public synchronized void e(String text) {
if (IS_DEBUG) {
for (String str : splitStr(text)) {
Log.e(getTAG(), str);
}
}
}
/**
* Log.d 打印
*
* @param text 需要打印的内容
*/
public synchronized void d(String text) {
if (IS_DEBUG) {
for (String str : splitStr(text)) {
Log.d(getTAG(), str);
}
}
}
/**
* Log.w 打印
*
* @param text 需要打印的内容
*/
public synchronized void w(String text) {
if (IS_DEBUG) {
for (String str : splitStr(text)) {
Log.w(getTAG(), str);
}
}
}
/**
* Log.i 打印
*
* @param text 需要打印的内容
*/
public synchronized void i(String text) {
if (IS_DEBUG) {
for (String str : splitStr(text)) {
Log.i(getTAG(), str);
}
}
}
/**
* Log.e 打印格式化后的JSON数据
*
* @param json 需要打印的内容
*/
public synchronized void json(String json) {
if (IS_DEBUG) {
String tag = getTAG();
try {
//转化后的数据
String logStr = formatJson(json);
for (String str : splitStr(logStr)) {
Log.e(getTAG(), str);
}
} catch (Exception e) {
e.printStackTrace();
Log.e(tag, e.toString());
}
}
}
/**
* 数据分割成不超过MAX_LENGTH的数据
*
* @param str 需要分割的数据
* @return 分割后的数组
*/
private String[] splitStr(String str) {
//字符串长度
int length = str.length();
//返回的数组
String[] strs = new String[length / MAX_LENGTH + 1];
//
int start = 0;
for (int i = 0; i < strs.length; i++) {
//判断是否达到最大长度
if (start + MAX_LENGTH < length) {
strs[i] = str.substring(start, start + MAX_LENGTH);
start += MAX_LENGTH;
} else {
strs[i] = str.substring(start, length);
start = length;
}
}
return strs;
}
/**
* 格式化
*
* @param jsonStr json数据
* @return 格式化后的json数据
* @author lizhgb
* @link https://my.oschina.net/jasonli0102/blog/517052
*/
private String formatJson(String jsonStr) {
if (null == jsonStr || "".equals(jsonStr))
return "";
StringBuilder sb = new StringBuilder();
char last = '\0';
char current = '\0';
int indent = 0;
boolean isInQuotationMarks = false;
for (int i = 0; i < jsonStr.length(); i++) {
last = current;
current = jsonStr.charAt(i);
switch (current) {
case '"':
if (last != '\\') {
isInQuotationMarks = !isInQuotationMarks;
}
sb.append(current);
break;
case '{':
case '[':
sb.append(current);
if (!isInQuotationMarks) {
sb.append('\n');
indent++;
addIndentBlank(sb, indent);
}
break;
case '}':
case ']':
if (!isInQuotationMarks) {
sb.append('\n');
indent--;
addIndentBlank(sb, indent);
}
sb.append(current);
break;
case ',':
sb.append(current);
if (last != '\\' && !isInQuotationMarks) {
sb.append('\n');
addIndentBlank(sb, indent);
}
break;
default:
sb.append(current);
}
}
return sb.toString();
}
/**
* 在 StringBuilder指定位置添加 space
*
* @param sb 字符集
* @param indent 添加位置
* @author lizhgb
* @link https://my.oschina.net/jasonli0102/blog/517052
*/
private void addIndentBlank(StringBuilder sb, int indent) {
for (int i = 0; i < indent; i++) {
sb.append('\t');
}
}
}
......@@ -17,6 +17,7 @@ import com.github.mjdev.libaums.UsbMassStorageDevice;
import com.github.mjdev.libaums.fs.UsbFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_show_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/colorAccent" />
<FrameLayout
android:id="@+id/frame_1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp" />
<!--分割线-->
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#26afcc" />
<FrameLayout
android:id="@+id/frame_2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp" />
</LinearLayout>
\ No newline at end of file
<?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">
<ImageView
android:id="@+id/iv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:contentDescription="@null" />
</RelativeLayout>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册