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

Add Base Mvp

Add Base Mvp Activity,Fragment,Impl.
上级 fbba6c45
......@@ -21,15 +21,16 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".base.TestActivity">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".usbUtil.UsbTestActivity"/>
<!--<activity android:name=".base.TestActivity" />-->
<activity android:name=".usbUtil.UsbTestActivity" />
<activity android:name=".base.test.TestActivity" />
<activity android:name=".mvp.test.MvpTestActivity" />
</application>
</manifest>
\ No newline at end of file
......@@ -5,6 +5,8 @@ import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.balckhao.blackhaoutil.base.test.TestActivity;
import com.balckhao.blackhaoutil.mvp.test.MvpTestActivity;
import com.balckhao.blackhaoutil.usbUtil.UsbTestActivity;
public class MainActivity extends AppCompatActivity {
......@@ -21,6 +23,13 @@ public class MainActivity extends AppCompatActivity {
Intent usbIntent = new Intent(this, UsbTestActivity.class);
startActivity(usbIntent);
break;
case R.id.log_base_test:
Intent logIntent = new Intent(this, TestActivity.class);
startActivity(logIntent);
break;
case R.id.mvp_base_test:
startActivity(new Intent(this, MvpTestActivity.class));
break;
}
}
}
package com.balckhao.blackhaoutil.base;
import android.annotation.StringRes;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.IdRes;
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.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
......@@ -109,7 +114,7 @@ public abstract class BaseActivity extends AppCompatActivity {
/**
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(int strId) {
public void showToast(@StringRes int strId) {
showToast(getString(strId));
}
......@@ -119,7 +124,7 @@ public abstract class BaseActivity extends AppCompatActivity {
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(int frameId, Fragment showFragment) {
public void replaceFragment(@IdRes int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//用于fragment的显示与隐藏
......
......@@ -2,6 +2,7 @@ package com.balckhao.blackhaoutil.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.SparseArray;
......@@ -77,9 +78,9 @@ public abstract class BaseFragment extends Fragment {
}
/**
* 显示Toast(可以在子线程中调用)
* 显示 Toast(可以在子线程中调用)
*/
public void showToast(int strId) {
public void showToast(@StringRes int strId) {
baseActivity.showToast(strId);
}
......
package com.balckhao.blackhaoutil.base;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
/**
* Author : BlackHao
* Time : 2018/12/4 16:30
* Description : 加载框
*/
public class LoadingDialog extends DialogFragment {
private String loadingTxt = "";
private TextView tvMsg;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
View view = inflater.inflate(R.layout.fragment_dialog_loading, container, false);
tvMsg = (TextView) view.findViewById(R.id.login_status_message);
if (!loadingTxt.equals("")) {
tvMsg.setText(loadingTxt);
}
//设置动画
RotateAnimation animation = new RotateAnimation(0, 360f, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(1000);
animation.setFillAfter(true);
animation.setInterpolator(new LinearInterpolator());
animation.setRepeatMode(Animation.RESTART);
animation.setRepeatCount(Animation.INFINITE);
view.findViewById(R.id.loading_img).startAnimation(animation);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setCancelable(false);
}
public void setLoadingTxt(String loadingTxt) {
this.loadingTxt = loadingTxt;
if (this.tvMsg != null) {
this.tvMsg.setText(loadingTxt);
}
}
public void setLoadingTxt(@StringRes int strId) {
setLoadingTxt(getString(strId));
}
}
package com.balckhao.blackhaoutil.base;
package com.balckhao.blackhaoutil.base.test;
import android.os.Message;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
import com.balckhao.blackhaoutil.base.BaseActivity;
import java.text.SimpleDateFormat;
import java.util.Date;
......
package com.balckhao.blackhaoutil.base;
package com.balckhao.blackhaoutil.base.test;
import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
import com.balckhao.blackhaoutil.base.CommonBaseAdapter;
import java.util.List;
/**
* Author : BlackHao
* Time : 2018/9/4 14:58
* Description :
* Description : TestAdapter
*/
public class TestAdapter extends CommonBaseAdapter<String> {
......
package com.balckhao.blackhaoutil.base;
package com.balckhao.blackhaoutil.base.test;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import com.balckhao.blackhaoutil.R;
import com.balckhao.blackhaoutil.base.BaseFragment;
import java.util.ArrayList;
......
......@@ -119,7 +119,7 @@ public class LogUtil {
}
/**
* 数据分割成不超过MAX_LENGTH的数据
* 数据分割成不超过 MAX_LENGTH的数据
*
* @param str 需要分割的数据
* @return 分割后的数组
......
package com.balckhao.blackhaoutil.mvp;
import android.annotation.StringRes;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import com.balckhao.blackhaoutil.base.LoadingDialog;
import com.balckhao.blackhaoutil.logUtil.LogUtil;
import java.lang.ref.WeakReference;
/**
* Author : BlackHao
* Time : 2018/12/20 16:38
* Description : Base MVP Activity
*/
public abstract class BaseMvpActivity<T extends BaseMvpPresenterImpl> extends AppCompatActivity implements BaseMvpViewImpl {
//Handler
public WeakHandler handler;
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
public LogUtil log;
//加载框
private LoadingDialog loadingDialog;
// Presenter
private T mPresenter;
//使用状态栏模式
private int statusMode = -1;
/**
* 不使用状态栏
*/
public static int NO_STATUS = -1;
/**
* 沉浸式状态栏
*/
public static int TRANSLUCENT_STATUS = 1;
/**
* 隐藏状态栏
*/
public static int HIDE_STATUS = 2;
/**
* 全屏(隐藏状态栏和导航栏)
*/
public static int FULL_SCREEN_STATUS = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化Log
log = LogUtil.getInstance();
//初始化fragmentArray
fragmentArray = new SparseArray<>();
//
loadingDialog = new LoadingDialog();
//获取presenter
mPresenter = initPresenter();
if (mPresenter != null)
mPresenter.onViewCreate();
//初始化UI
initUI();
//初始化weakHandler
initHandler();
//隐藏 ActionBar
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
//更改状态栏模式
statusMode = getStatusMode();
if (statusMode == TRANSLUCENT_STATUS) {
translucentStatus();
} else if (statusMode == HIDE_STATUS) {
hideStatusBar();
}
//view 初始化完成
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
//
if (mPresenter != null)
mPresenter.onViewCreated();
//初始化数据
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
*/
private void initHandler() {
handler = new WeakHandler(this);
}
/**
* 初始化 presenter
*/
protected abstract T initPresenter();
/**
* 获取 presenter
*/
public T getPresenter() {
return mPresenter;
}
/**
* 获取状态栏模式(默认无状态栏模式,修改状态栏模式只需重写该方法)
*/
public int getStatusMode() {
return NO_STATUS;
}
/**
* 显示 Toast(可以在子线程中调用)
*/
@Override
public void showToast(final String str) {
if (!isUIThread()) {
handler.post(new Runnable() {
@Override
public void run() {
showToast(str);
}
});
return;
}
Toast.makeText(BaseMvpActivity.this, str, Toast.LENGTH_SHORT).show();
}
/**
* 显示 Toast(可以在子线程中调用)
*/
@Override
public void showToast(@StringRes int strId) {
showToast(getString(strId));
}
/**
* 加载框相关
*/
@Override
public void showLoading(@StringRes int strId) {
showLoading(getString(strId));
}
@Override
public void showLoading(final String str) {
if (!isUIThread()) {
handler.post(new Runnable() {
@Override
public void run() {
showLoading(str);
}
});
return;
}
log.e("show : " + str);
loadingDialog.setLoadingTxt(str);
loadingDialog.show(getSupportFragmentManager(), "loading");
}
@Override
public void showLoading() {
showLoading("");
}
@Override
public void dismissLoading() {
if (!isUIThread()) {
handler.post(new Runnable() {
@Override
public void run() {
dismissLoading();
}
});
return;
}
loadingDialog.dismiss();
}
/**
* 替换 fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(@IdRes 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);
}
/**
* activity 跳转
*
* @param target 需要跳转的 Activity
* @param bundle bundle
* @param requestCode requestCode
*/
public void openActivityForResult(Class<?> target, Bundle bundle, int requestCode) {
Intent intent = new Intent(this, target);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
/**
* 生命周期相关
*/
@Override
protected void onResume() {
super.onResume();
if (mPresenter != null)
mPresenter.onResume();
}
@Override
protected void onPause() {
super.onPause();
if (mPresenter != null)
mPresenter.onPause();
}
@Override
protected void onStart() {
super.onStart();
if (mPresenter != null)
mPresenter.onStart();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null)
mPresenter.onDestroy();
}
@Override
protected void onStop() {
super.onStop();
if (mPresenter != null)
mPresenter.onStop();
}
/**
* 判断当前线程是否在主线程
*/
public boolean isUIThread() {
return Thread.currentThread().getId() == Looper.getMainLooper().getThread().getId();
}
/**
* 沉浸式状态栏
*/
public void translucentStatus() {
//5.0及以上系统才支持
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
}
/**
* 隐藏状态栏
*/
public void hideStatusBar() {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//Android 4.4及以上系统才支持
if (statusMode == FULL_SCREEN_STATUS && hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
/**
* 弱引用 handler
*/
public static class WeakHandler extends Handler {
WeakReference weakReference;
WeakHandler(BaseMvpActivity activity) {
this.weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
BaseMvpActivity activity = (BaseMvpActivity) weakReference.get();
switch (msg.what) {
default:
if (activity != null) {
activity.handleMessage(msg);
}
break;
}
}
}
}
\ No newline at end of file
package com.balckhao.blackhaoutil.mvp;
import android.annotation.StringRes;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.IdRes;
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/12/20 16:38
* Description : Base MVP Fragment (必须在 BaseMvpActivity 中调用)
*/
public abstract class BaseMvpFragment<T extends BaseMvpPresenterImpl> extends Fragment implements BaseMvpViewImpl {
//用于保存对应 FrameLayout当前显示的 Fragment
private SparseArray<Fragment> fragmentArray;
//LogUtil
public LogUtil log;
// Presenter
private T mPresenter;
//Activity
private BaseMvpActivity activity;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = (BaseMvpActivity) getActivity();
mPresenter = initPresenter();
//
fragmentArray = new SparseArray<>();
log = activity.log;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(initLayoutId(), container, false);
initUI(view);
//
if (mPresenter != null)
mPresenter.onViewCreate();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initData();
initListener();
if (mPresenter != null)
mPresenter.onViewCreated();
}
/**
* 初始化UI
*/
protected abstract int initLayoutId();
/**
* 初始化UI
*/
protected abstract void initUI(View view);
/**
* UI初始化完成,初始化数据
*/
protected abstract void initData();
/**
* UI初始化完成,初始化接口
*/
protected abstract void initListener();
/**
* 初始化 presenter
*/
protected abstract T initPresenter();
/**
* 获取 presenter
*/
public T getPresenter() {
return mPresenter;
}
/**
* 显示 Toast(可以在子线程中调用)
*/
@Override
public void showToast(final String str) {
activity.showToast(str);
}
/**
* 显示 Toast(可以在子线程中调用)
*/
@Override
public void showToast(@StringRes int strId) {
showToast(getString(strId));
}
/**
* 加载框相关
*/
@Override
public void showLoading(@StringRes int strId) {
showLoading(getString(strId));
}
@Override
public void showLoading(String str) {
activity.showLoading(str);
}
@Override
public void showLoading() {
activity.showLoading();
}
@Override
public void dismissLoading() {
activity.dismissLoading();
}
/**
* 替换 fragment
*
* @param frameId frameLayout id
* @param showFragment 需要显示的 Fragment
*/
public void replaceFragment(@IdRes int frameId, Fragment showFragment) {
Fragment currentFragment = fragmentArray.get(frameId);
FragmentTransaction transaction = getFragmentManager().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(getContext(), target);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
if (isCloseSelf) {
activity.finish();
}
}
/**
* activity 跳转(不需要传值)
*
* @param target 需要跳转的Activity
*/
public void openActivity(Class<?> target) {
openActivity(target, null, false);
}
/**
* activity 跳转
*
* @param target 需要跳转的 Activity
* @param bundle bundle
* @param requestCode requestCode
*/
public void openActivityForResult(Class<?> target, Bundle bundle, int requestCode) {
Intent intent = new Intent(getContext(), target);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
/**
* 生命周期相关
*/
@Override
public void onResume() {
super.onResume();
if (mPresenter != null)
mPresenter.onResume();
}
@Override
public void onPause() {
super.onPause();
if (mPresenter != null)
mPresenter.onPause();
}
@Override
public void onStart() {
super.onStart();
if (mPresenter != null)
mPresenter.onStart();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPresenter != null)
mPresenter.onDestroy();
}
@Override
public void onStop() {
super.onStop();
if (mPresenter != null)
mPresenter.onStop();
}
}
\ No newline at end of file
package com.balckhao.blackhaoutil.mvp;
import android.content.Context;
import android.view.View;
import java.lang.ref.WeakReference;
/**
* Author : BlackHao
* Time : 2018/12/20 09:05
* Description : Presenter 封装
*/
public abstract class BaseMvpPresenter<T extends BaseMvpViewImpl> implements BaseMvpPresenterImpl {
/**
* 弱引用持有
*/
private WeakReference<T> mView;
private WeakReference<Context> mContext;
public BaseMvpPresenter(Context context, T mView) {
this.mView = new WeakReference<>(mView);
this.mContext = new WeakReference<>(context);
}
public T getView() {
return mView.get();
}
public Context getContext() {
return mContext.get();
}
@Override
public void onViewCreate() {
}
@Override
public void onViewCreated() {
}
@Override
public void onResume() {
}
@Override
public void onStart() {
}
@Override
public void onPause() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
}
package com.balckhao.blackhaoutil.mvp;
/**
* Author : BlackHao
* Time : 2018/12/19 19:48
* Description : Presenter 封装
*/
public interface BaseMvpPresenterImpl {
/**
* 开始创建 View
*/
void onViewCreate();
/**
* View 创建完成
*/
void onViewCreated();
/**
* Activity / fragment 生命周期
*/
void onResume();
void onStart();
void onPause();
void onStop();
void onDestroy();
}
package com.balckhao.blackhaoutil.mvp;
import android.support.annotation.StringRes;
/**
* Author : BlackHao
* Time : 2018/12/19 19:11
* Description : View 层基类
*/
public interface BaseMvpViewImpl {
/**
* Toast相关
*/
void showToast(@StringRes int strId);
void showToast(String str);
/**
* 加载框相关
*/
void showLoading(@StringRes int strId);
void showLoading(String str);
void showLoading();
void dismissLoading();
}
package com.balckhao.blackhaoutil.mvp.test;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
import com.balckhao.blackhaoutil.mvp.BaseMvpActivity;
/**
* Author : BlackHao
* Time : 2018/12/20 10:15
* Description :
*/
public class MvpTestActivity extends BaseMvpActivity<TestMvpContract.TestPresenterImpl>
implements TestMvpContract.TestViewImpl {
private EditText etName;
private EditText etPsw;
private TextView tvLoginResult;
@Override
protected void initUI() {
setContentView(R.layout.activity_mvp_test);
etName = (EditText) findViewById(R.id.et_name);
etPsw = (EditText) findViewById(R.id.et_psw);
tvLoginResult = (TextView) findViewById(R.id.tv_login_result);
replaceFragment(R.id.fl_test, new MvpTestFragment());
}
@Override
public int getStatusMode() {
return TRANSLUCENT_STATUS;
}
@Override
protected void initData() {
}
@Override
protected void initListener() {
}
@Override
protected void handleMessage(Message msg) {
log.e(msg.what + "");
}
@Override
protected TestMvpContract.TestPresenterImpl initPresenter() {
return new TestPresenter(this, this);
}
@Override
public void loginResult(String txt) {
tvLoginResult.setText(txt);
handler.sendEmptyMessage(0);
}
public void onClick(View view) {
getPresenter().login(etName.getText().toString(), etPsw.getText().toString());
}
}
package com.balckhao.blackhaoutil.mvp.test;
import android.graphics.Color;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.balckhao.blackhaoutil.R;
import com.balckhao.blackhaoutil.mvp.BaseMvpActivity;
import com.balckhao.blackhaoutil.mvp.BaseMvpFragment;
/**
* Author : BlackHao
* Time : 2018/12/20 10:15
* Description :
*/
public class MvpTestFragment extends BaseMvpFragment<TestMvpContract.TestPresenterImpl>
implements TestMvpContract.TestViewImpl, View.OnClickListener {
private EditText etName;
private EditText etPsw;
private TextView tvLoginResult;
@Override
protected int initLayoutId() {
return R.layout.activity_mvp_test;
}
@Override
protected void initUI(View view) {
etName = (EditText) view.findViewById(R.id.et_name);
etPsw = (EditText) view.findViewById(R.id.et_psw);
tvLoginResult = (TextView) view.findViewById(R.id.tv_login_result);
view.findViewById(R.id.bt_login).setOnClickListener(this);
view.setBackgroundColor(Color.parseColor("#ebebeb"));
}
@Override
protected void initData() {
}
@Override
protected void initListener() {
}
@Override
protected TestMvpContract.TestPresenterImpl initPresenter() {
return new TestPresenter(getContext(), this);
}
@Override
public void loginResult(String txt) {
tvLoginResult.setText(txt);
}
@Override
public void onClick(View view) {
getPresenter().login(etName.getText().toString(), etPsw.getText().toString());
}
}
package com.balckhao.blackhaoutil.mvp.test;
import com.balckhao.blackhaoutil.mvp.BaseMvpPresenterImpl;
import com.balckhao.blackhaoutil.mvp.BaseMvpViewImpl;
/**
* Author : BlackHao
* Time : 2018/12/20 10:16
* Description :
*/
public class TestMvpContract {
public interface TestViewImpl extends BaseMvpViewImpl {
void loginResult(String txt);
}
public interface TestPresenterImpl extends BaseMvpPresenterImpl {
void login(String name ,String psw);
void loginOut();
}
}
package com.balckhao.blackhaoutil.mvp.test;
import android.content.Context;
import com.balckhao.blackhaoutil.mvp.BaseMvpPresenter;
/**
* Author : BlackHao
* Time : 2018/12/20 10:17
* Description : TestPresenter
*/
public class TestPresenter extends BaseMvpPresenter<TestMvpContract.TestViewImpl> implements TestMvpContract.TestPresenterImpl {
public TestPresenter(Context context, TestMvpContract.TestViewImpl mView) {
super(context, mView);
}
@Override
public void login(final String name, final String psw) {
getView().showLoading("正在登陆...");
new Thread(new Runnable() {
@Override
public void run() {
//休眠,模拟登陆
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (name.equals("admin") && psw.equals("admin")) {
getView().loginResult("登陆成功,Login ID:" + 123456);
} else {
getView().loginResult("登陆失败,用户不存在");
getView().showToast("登陆失败,用户不存在");
}
getView().dismissLoading();
}
}).start();
}
@Override
public void loginOut() {
}
}
......@@ -45,7 +45,7 @@ public class SharedPreferencesUtil {
}
/**
* 保存数据到SharedPreferences
* 保存数据到 SharedPreferences
*
* @param key 键
* @param value 需要保存的数据
......@@ -82,7 +82,6 @@ public class SharedPreferencesUtil {
} catch (Exception e) {
result = false;
e.printStackTrace();
// Log.e("SharedPreferencesUtil", e.toString());
}
editor.apply();
return result;
......@@ -190,10 +189,10 @@ public class SharedPreferencesUtil {
}
/**
* 获取保存的List
* 获取保存的 List
*
* @param key key
* @return 对应的Lis集合
* @return 对应的 List集合
*/
public static <T> List<T> getListData(String key, Class<T> cls) {
List<T> list = new ArrayList<>();
......
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#cdcdcd"
android:pathData="M546.463 266.293c-73.41 0-133.155-59.727-133.155-133.138C413.308 59.763 473.053
0 546.463 0s133.12 59.727 133.12 133.155c0 73.41-59.71 133.138-133.12
133.138zM263.009 372.03c-67.054 0-121.626-54.555-121.626-121.644s54.572-121.644
121.626-121.644a121.768 121.768 0 0 1 121.609 121.644c0 67.054-54.555
121.644-121.609 121.644zM142.548 647.186A107.343 107.343 0 0 1 35.31
539.896a107.343 107.343 0 0 1 107.238-107.238 107.343 107.343 0 0 1 107.22
107.237 107.343 107.343 0 0 1-107.22 107.273z m120.461 272.596a91.048 91.048 0 0
1-90.942-90.96 91.065 91.065 0 0 1 90.924-90.942 91.065 91.065 0 0 1 90.942
90.942c0 50.14-40.783 90.96-90.924 90.96zM546.463 1024a79.519 79.519 0 0
1-79.448-79.448c0-43.82 35.645-79.449 79.448-79.449a79.519 79.519 0 0 1 79.43
79.449c0 43.82-35.628 79.448-79.448 79.448z m287.744-134.285a64.194 64.194 0 0
1-64.124-64.124 64.194 64.194 0 0 1 64.124-64.123 64.194 64.194 0 0 1 64.123
64.123 64.194 64.194 0 0 1-64.123 64.124zM952.055 593.02a52.683 52.683 0 0
1-52.612-52.613 52.683 52.683 0 0 1 52.612-52.63 52.7 52.7 0 0 1 52.63 52.613
52.718 52.718 0 0 1-52.63 52.63zM793.388 254.323a40.819 40.819 0 1 0 81.655
0.017 40.819 40.819 0 0 0-81.655 0z" />
</vector>
\ No newline at end of file
......@@ -17,6 +17,26 @@
android:onClick="onClick"
android:text="UsbTest"
android:textAllCaps="false" />
<Button
android:id="@+id/log_base_test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="LogUtil/BaseXXX"
android:textAllCaps="false" />
<Button
android:id="@+id/mvp_base_test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="1"
android:onClick="onClick"
android:text="MvpBase"
android:textAllCaps="false" />
</LinearLayout>
......
<?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"
android:background="#26afcc">
<EditText
android:id="@+id/et_name"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:hint="用户名" />
<EditText
android:id="@+id/et_psw"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:hint="密码" />
<Button
android:id="@+id/bt_login"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:onClick="onClick"
android:text="登陆" />
<TextView
android:id="@+id/tv_login_result"
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="登陆结果" />
<FrameLayout
android:id="@+id/fl_test"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
<?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">
<ImageView
android:id="@+id/loading_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:background="@drawable/icon_loading"
android:contentDescription="@null" />
<TextView
android:id="@+id/login_status_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_gravity="center_horizontal"
android:textColor="#000"
android:text="@string/login_progress_searching"
android:textSize="16sp"/>
</LinearLayout>
\ No newline at end of file
<resources>
<string name="app_name">BlackHaoUtil</string>
<string name="copy_failed">复制文件失败</string>
<string name="login_progress_searching">正在加载…</string>
</resources>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册