1.MVP概念与实例
M: 数据层,主要是数据的获得,存储等操作
V : 视图层,主要有activity完成,用于显示和用户交互
P : Presenter层,持有Model,View的引用,让两者进行数据上的交互
下面是一个简单的例子:
首先看一下结构:
Model层:继承IstudentModel接口
public class StudentModel implements IStudentModel {
@Override
public Student getStudentById(String id) {
//在这边做数据操作,可以通过网络获取,数据获取等等
Student bean = new Student();
bean.setId(id);
bean.setName("姚明");
return bean;
}
@Override
public Student getStudentByName(String name) {
Student bean = new Student();
bean.setId("10001");
bean.setName(name);
return bean;
}
}
VIEW层:同样继承IStudentView接口
public class MainActivity extends AppCompatActivity implements IStudentView,View.OnClickListener {
private EditText mNameEt,mIdEt;
private Button mGetNameByIdBtn,mGetIdByNameBtn;
private StudentPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
presenter = new StudentPresenter(this);
mNameEt = (EditText) findViewById(R.id.et_xm);
mIdEt = (EditText) findViewById(R.id.et_xh);
mGetNameByIdBtn = (Button) findViewById(R.id.btn_xm);
mGetIdByNameBtn = (Button) findViewById(R.id.btn_xh);
mGetIdByNameBtn.setOnClickListener(this);
mGetNameByIdBtn.setOnClickListener(this);
}
@Override
public void setName(String name) {
mNameEt.setText(name);
}
@Override
public String getId() {
return mIdEt.getText().toString().trim();
}
@Override
public void setId(String id) {
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_xh:
presenter.setStudentName(getId());
Log.e("TAG","View id = " + getId());
break;
}
}
}
IStudentView接口
public interface IStudentView {
void setName(String name);
void setId(String id);
String getId();
}
presenter层:持有model和view的引用
/**
* Created by Administrator on 2016/3/12.
* 在这边持有IStudentModel,IStudentView的应用
* 做数据交互
*/
public class StudentPresenter {
private IStudentModel mModel;
private IStudentView mView;
public StudentPresenter(IStudentView view){
this.mView = view;
mModel = new StudentModel();
}
public void setStudentName(String id){
Student bean = mModel.getStudentById(id);
mView.setName(bean.getName());
Log.e("TAG","id = " + id + ",name = " + bean.getName());
}
public void setStudentId(String name){
Student bean = mModel.getStudentByName(name);
mView.setId(bean.getId());
}
}
2.Fragmemt
我相信fragment大家一定用的很多,很多项目是一个Activity加多个fragment来实现的。fragment有占内存小,能提高性能
首先推荐一篇好的博客:Fragment全解析
自己遇到的问题就是在Fragment启动startActivityForResult,如果你在FragmentActivity中有onActivityResult,无论在Fragment中调用的是Fragment还是Activity的startActivityForResult都是会先进入Activity的onActivityResult,如果调用的是fragment的startActivityFotResult想传到fragment中的onActivityResult中就要在activity中加上super.onActivityResult(requestCode,resultCode,data);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data != null){
String code = data.getStringExtra("Code");
((ScanFragment)storageFragment).setCodeValue(code);
}
//传递给Fragment的onActivityResult
super.onActivityResult(requestCode,resultCode,data);
}
3.PopupWindow
要给PopupWindow添加背景,才能相应返回键
mPopupWindow.setBackgroundDrawable(new ColorDrawable());