之前在做项目的时候,一直用的是mvc,但是在mvc模式中,有时候会在activity中写很多逻辑,导致activity看着很臃肿,这是因为model可以和view互交,现在我们来了解mvp模式。
首先我们看下mvc:
controller:相当于activity
view:相当于布局文件
model:处理逻辑与实体对象
我们在看下mvp:
view:相当于activity
presenter:是view和model之间的桥梁,负责数据的传递
modle:处理逻辑与实体对象
下面我们看个简单的mvp例子:
1.view:(Activity):
public class MainActivity extends AppCompatActivity implements InterfaceShow {
private EditText name, pass;
private InterfacePersent interfacePersentImpl;
private CustomProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (EditText) findViewById(R.id.name);
pass = (EditText) findViewById(R.id.pass);
progressDialog=new CustomProgressDialog(this, "");
}
public void LoginOnclick(View view){
interfacePersentImpl=new InterfacePersentImpl();
interfacePersentImpl.login(name.getText().toString(),pass.getText().toString(),this);
}
@Override
public void showShow() {
progressDialog.show();
}
@Override
public void hideShow() {
progressDialog.hide();
}
@Override
public void successShow() {
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void failedShow(String string) {
Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
}
}
2.persenert:
public interface InterfaceShow {
public void showShow();
public void hideShow();
public void successShow();
public void failedShow(String string);
}
public class InterfacePersentImpl implements InterfacePersent,MyListense{
private Mode mode;
private InterfaceShow interfaceShow;
public InterfacePersentImpl() {
mode = new ModeImpl(this);
}
@Override
public void login(String name, String pass, InterfaceShow interfaceShow) {
this.interfaceShow=interfaceShow;
if (!name.equals("") && name != null && name.length() > 0 && !pass.equals("") && pass != null && pass.length() > 0) {
mode.loginMode();
interfaceShow.showShow();
} else if(name.equals("") || name==null || name.length()==0){
mode.loginFailedNameMode();
}else if(pass.equals("") || pass==null || pass.length()==0){
mode.loginFailedPassMode();
}
}
@Override
public void success() {
interfaceShow.successShow();
interfaceShow.hideShow();
}
@Override
public void Failed(String string) {
interfaceShow.failedShow(string);
interfaceShow.hideShow();
}
}
public interface InterfacePersent {
public void login(String name,String pass,InterfaceShow interfaceShow);
}
public interface MyListense {
public void success();
public void Failed(String string);
}
3.model
public interface Mode {
public void loginMode();
public void loginFailedNameMode();
public void loginFailedPassMode();
}
public class ModeImpl implements Mode {
private MyListense myListense;
public ModeImpl(MyListense myListense) {
this.myListense=myListense;
}
@Override
public void loginMode() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
myListense.success();
}
}, 3000);
}
@Override
public void loginFailedNameMode() {
myListense.Failed("用户名不能为空");
}
@Override
public void loginFailedPassMode() {
myListense.Failed("密码不能为空");
}
}
最后是一个progress:
public class CustomProgressDialog extends Dialog {
public CustomProgressDialog(Context context, String strMessage) {
// this(context, R.style.CustomProgressDialog, strMessage);
this(context, R.style.dialog, strMessage);
}
public CustomProgressDialog(Context context, int theme, String strMessage) {
super(context, theme);
this.setContentView(R.layout.customprogressdialog);
this.getWindow().getAttributes().gravity = Gravity.CENTER;
this.setCanceledOnTouchOutside(false);
TextView tvMsg = (TextView) this.findViewById(R.id.id_tv_loadingmsg);
if (tvMsg != null) {
if(strMessage!=null && strMessage.length()>0){
tvMsg.setVisibility(View.VISIBLE);
tvMsg.setText(strMessage);
}else{
tvMsg.setVisibility(View.GONE);
}
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus) {
dismiss();
}
}
}
R.style.dialog:
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item><!--边框-->
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">false</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明 去掉背景色边框也就去掉了 -->
<item name="android:backgroundDimEnabled">false</item><!--模糊-->
<!-- <item name="android:windowContentOverlay">@null</item> -->
<!-- android:backgroundDimAmount就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容,系统的默认值是0.5,而已根据自己的需要调整 -->
<item name="android:backgroundDimAmount">0.5</item>
</style>
R.layout.customprogressdialog:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:padding="8dp" >
<ProgressBar
android:id="@+id/loadingImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:indeterminateDrawable="@anim/progress_medium" />
<TextView
android:id="@+id/id_tv_loadingmsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@android:color/white"
android:textSize="18dp" />
</LinearLayout>
anim:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/dialog"
android:fromDegrees="0"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toDegrees="360" />
@drawable/dialog图片随便找一个就行了