基于谷歌todoapp的android mvp(三)
来源:互联网 发布:web项目压缩js 编辑:程序博客网 时间:2024/06/06 08:50
这是我文章讲解的项目地址点击这里移步到我的项目地址
这里看一下整体的项目结构
这是谷歌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,在上面的文章中有数据请求等等,可以看一下上文
我感觉基本要说的重点都说完了,但是仅仅看我感觉用处不大,还是自己亲身写一下体验一下比较好,这是我文章讲解的项目地址
点击这里移步到我的项目地址
0 0
- 基于谷歌todoapp的android mvp(三)
- 基于谷歌todoapp的android mvp(一)
- 基于谷歌todoapp的android mvp(二)
- Android当中的MVP模式(三)基于分页列表的封装
- 基于谷歌todo-mvp写的例子
- Android---MVP设计模式高级(三)
- <Android 基础(三)> MVP模式
- Android---MVP设计模式高级(三)
- 基于Android的mvc、mvp以及mvvm架构分析(上)
- 基于MVP设计模式的Android应用架构设计
- 基于Android Architecture Blueprints的MVP案例分析与实现
- 软件设计模式:基于MVP的Android项目架构
- 基于MVP开发模式的简单Android项目
- android 快速开发框架,基于组件化的MVP结构
- Android基于MVP框架的联网登陆软件
- MVP (1)- Android mvp 架构的自述
- MVP架构在Android平台上的实现分析(三)
- Android 神兵利器Dagger2使用详解(三)MVP架构下的使用
- IntelliJ IDEA 开发 WebService
- 解析书写PLSQL的工具
- Eclipse 使用mybatis generator插件自动生成代码
- shell脚本采用sed批量修改文件
- Node.js笔记
- 基于谷歌todoapp的android mvp(三)
- 数据库2—逻辑设计
- uboot分析二
- SeetaFace中科院开源人脸项目Ubuntu下编译
- struts2实现文件上传
- java时间显示,昨天今天前天
- 关于在C#中数组(byte[])复制的两种方式。字节偏移复制与安全复制
- 超级账本成员突破100家
- mysql基础----触发器(十一)