这是我文章讲解的项目地址点击这里移步到我的项目地址
这里看一下整体的项目结构
这是谷歌demo进行包的划分,请移步这里
按照一般的逻辑来讲,很少有一个activity包一个fragment,我见得大多数的情况都是主页几个tab用fragment然后用一个activity包起来
看一下homeactivty
package com.fanyafeng.todomvp.home;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.fanyafeng.todomvp.R;
import com.fanyafeng.todomvp.BaseActivity;
import com.fanyafeng.todomvp.home.main.HomeFragment;
import com.fanyafeng.todomvp.home.main.HomePresenter;
import com.fanyafeng.todomvp.home.personal.PersonalFragment;
import com.fanyafeng.todomvp.home.recommend.RecommendFragment;
//需要搭配Baseactivity,这里默认为Baseactivity,并且默认BaseActivity为包名的根目录
public class HomeActivity extends BaseActivity {
private static String[] FRAGMENT_TAGS = new String[]{"1", "2", "3"};
private View[] tabs = new View[3];
private HomeFragment homeFragment;
private RecommendFragment recommendFragment;
private PersonalFragment personalFragment;
private FragmentManager fragmentManager;
private ImageView tab_img1;
private TextView tab_text1;
private ImageView tab_img2;
private TextView tab_text2;
private ImageView tab_img3;
private TextView tab_text3;
private int current = 0;
private int currentTab = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
current = savedInstanceState.getInt("tab");
} else {
current = 0;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
title = getString(R.string.title_activity_home);
fragmentManager = getSupportFragmentManager();
initView();
initData();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
if (current != -1) {
outState.putInt("tab", current);
}
super.onSaveInstanceState(outState);
}
//初始化UI控件
private void initView() {
tabs[0] = findViewById(R.id.tab_one);
tab_img1 = (ImageView) findViewById(R.id.tab_img1);
tab_text1 = (TextView) findViewById(R.id.tab_text1);
tabs[1] = findViewById(R.id.tab_two);
tab_img2 = (ImageView) findViewById(R.id.tab_img2);
tab_text2 = (TextView) findViewById(R.id.tab_text2);
tabs[2] = findViewById(R.id.tab_three);
tab_img3 = (ImageView) findViewById(R.id.tab_img3);
tab_text3 = (TextView) findViewById(R.id.tab_text3);
for (int i = 0; i < tabs.length; i++) {
final int j = i;
tabs[i].setTag(i);
tabs[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectTab(j);
}
});
}
selectTab(current);
}
private void selectTab(int tab) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
switch (tab) {
case 0:
if (currentTab != 0) {
clearTabSelection();
hideFragement(fragmentTransaction);
tab_text1.setTextColor(Color.parseColor("#78e0ff"));
tab_img1.setImageResource(R.drawable.simle_logo_00);
tab_img2.setImageResource(R.drawable.simle_logo_02);
tab_img3.setImageResource(R.drawable.simle_logo_03);
if (homeFragment == null) {
homeFragment = new HomeFragment();
new HomePresenter(this, homeFragment);
fragmentTransaction.add(R.id.container, homeFragment, FRAGMENT_TAGS[0]);
} else {
fragmentTransaction.show(homeFragment);
}
current = 0;
currentTab = 0;
}
break;
case 1:
if (currentTab != 1) {
clearTabSelection();
hideFragement(fragmentTransaction);
tab_text2.setTextColor(Color.parseColor("#78e0ff"));
tab_img1.setImageResource(R.drawable.simle_logo_01);
tab_img2.setImageResource(R.drawable.simle_logo_00);
tab_img3.setImageResource(R.drawable.simle_logo_03);
if (recommendFragment == null) {
recommendFragment = new RecommendFragment();
fragmentTransaction.add(R.id.container, recommendFragment, FRAGMENT_TAGS[1]);
} else {
fragmentTransaction.show(recommendFragment);
}
current = 1;
currentTab = 1;
}
break;
case 2:
if (currentTab != 2) {
clearTabSelection();
hideFragement(fragmentTransaction);
tab_text3.setTextColor(Color.parseColor("#78e0ff"));
tab_img1.setImageResource(R.drawable.simle_logo_01);
tab_img2.setImageResource(R.drawable.simle_logo_02);
tab_img3.setImageResource(R.drawable.simle_logo_00);
if (personalFragment == null) {
personalFragment = new PersonalFragment();
fragmentTransaction.add(R.id.container, personalFragment, FRAGMENT_TAGS[2]);
} else {
fragmentTransaction.show(personalFragment);
}
current = 2;
currentTab = 2;
}
break;
}
fragmentTransaction.commit();
}
//初始化数据
private void initData() {
}
/**
* 设置为默认颜色
*/
private void clearTabSelection() {
tab_text1.setTextColor(Color.RED);
tab_text2.setTextColor(Color.RED);
tab_text3.setTextColor(Color.RED);
}
private void hideFragement(FragmentTransaction fragmentTransaction) {
if (homeFragment != null) {
fragmentTransaction.hide(homeFragment);
}
if (recommendFragment != null) {
fragmentTransaction.hide(recommendFragment);
}
if (personalFragment != null) {
fragmentTransaction.hide(personalFragment);
}
}
}
我这里就拿home举了个例子,其他的没有写,在新建fragment的时候对p进行了初始化
if (homeFragment == null) {
homeFragment = new HomeFragment();
new HomePresenter(this, homeFragment);
fragmentTransaction.add(R.id.container, homeFragment, FRAGMENT_TAGS[0]);
} else {
fragmentTransaction.show(homeFragment);
}
再来看一下contract,就是理清楚项目的大体结构的关键,当然这里仅仅针对的是home这一个fragment
package com.fanyafeng.todomvp.home.main;
import com.fanyafeng.todomvp.BasePresenter;
import com.fanyafeng.todomvp.BaseView;
/**
* Author: fanyafeng
* Data: 16/12/6 12:12
* Email: fanyafeng@live.cn
*/
public interface HomeContract {
interface View extends BaseView<Presenter> {
void changeHomeDesc(String desc);
}
interface Presenter extends BasePresenter {
}
}
这里的view继承了baseview,presenter继承了basepresenter再来看一下p
package com.fanyafeng.todomvp.home.main;
import android.content.Context;
/**
* Author: fanyafeng
* Data: 16/12/6 12:13
* Email: fanyafeng@live.cn
*/
public class HomePresenter implements HomeContract.Presenter {
private Context context;
private HomeContract.View homeView;
public HomePresenter(Context context, HomeContract.View homeView) {
this.context = context;
this.homeView = homeView;
homeView.setPresenter(this);
}
@Override
public void start() {
homeView.changeHomeDesc("P中更改首页描述");
}
}
这里是进行ui的操作,还有就是在构造方法中给view进行set了p,这一点不要忘记
最后看一下v也就是fragment
package com.fanyafeng.todomvp.home.main;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.fanyafeng.todomvp.R;
public class HomeFragment extends Fragment implements HomeContract.View {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private TextView tvHomeDesc;
private HomeContract.Presenter mPresenter;
public HomeFragment() {
}
public static HomeFragment newInstance(String param1, String param2) {
HomeFragment fragment = new HomeFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public void onResume() {
super.onResume();
mPresenter.start();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
initData();
}
private void initView() {
tvHomeDesc = (TextView) getActivity().findViewById(R.id.tvHomeDesc);
}
private void initData() {
}
@Override
public void changeHomeDesc(String desc) {
tvHomeDesc.setText(desc);
}
@Override
public void setPresenter(HomeContract.Presenter presenter) {
mPresenter = presenter;
}
}
这里是在fragment方法中进行的p的start,简单来讲就是在view实例化完成以后就可以进行star中的操作了,这里仅仅是更新的ui,在上面的文章中有数据请求等等,可以看一下上文
我感觉基本要说的重点都说完了,但是仅仅看我感觉用处不大,还是自己亲身写一下体验一下比较好,这是我文章讲解的项目地址
点击这里移步到我的项目地址