在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用。

在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准确点说是一个资讯+社交的校园app。目标用户是在校大学生,老师。项目初期提供的功能有:校园资讯,校园服务,校园问答,核心的社交功能会在稍后视情况推出。我们的竞争对手有微信,QQ,空间,微博,知乎。。。等杀手级应用,所以我们压力还是有点大,但是,还有机会(逃。。。当我没说。

具体的产品构思和运营方案会在项目后期发布。。。

现如今,有人说移动互联网已死,接下来是AI的时代,或者更准确的说移动互联网的红利期已经过去,下一个经济爆发点在AI领域。。

先不说我们能否准确的揣测这个时代的发展,但是有些现象很真实:从2015下到2016开始,Android低端程序员过剩,app的装机量已经停滞不前,App的推广成本越来越高,微信微博等巨头把控着移动端的流量入口,资本热度逐渐退去,初创公司融资困难,移动端的寒潮来临。2000年PC互联网泡沫,08年全球金融危机,随后几年移动互联网蓬勃发展,这几年移动遇冷,资本市场疲惫,创业越来越难,无独有偶,近年来大数据和人工智能又大行其道。。。不由得开始思考,这种种背后是技术的必然发展,还是资本的时代博弈。。。编不下去了。。。逃。。

下面开始正题。。。

我使用的开发工具是Android Studio 2.3.3

工程结构:

最终达到的效果:侧滑功能使用了第三方库SlidingMenu,可以自行在github下载,也可以直接copy我的(https://github.com/Vito-Yan/MYangtzeu)

具体的实现步骤:

1、MainActivity继承我们的第三方框架SlidingFragmentActivity,这个类是程序的入口,重写了onCreate方法,初始化SlidingMenu方法和Fragement方法

package com.vitoyan.myangtzeu.activity;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.DisplayMetrics;
import android.view.Window; import com.vitoyan.myangtzeu.R;
import com.vitoyan.myangtzeu.fragment.LeftmenuFragment;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
import com.vitoyan.myangtzeu.fragment.ContentFragment; public class MainActivity extends SlidingFragmentActivity {
private int screeWidth;
private int screeHeight; public static final String MAIN_CONTENT_TAG = "main_content_tag";
public static final String LEFTMENU_TAG = "leftmenu_tag"; @Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置没有标题
super.onCreate(savedInstanceState);
initSlidingMenu();
//初始化Fragment
initFragment(); } private void initSlidingMenu() {
//1.设置主页面
setContentView(R.layout.activity_main); //2.设置左侧菜单
setBehindContentView(R.layout.activity_leftmenu); //3.设置右侧菜单
SlidingMenu slidingMenu = getSlidingMenu();
// slidingMenu.setSecondaryMenu(R.layout.activity_rightmenu);//设置右侧菜单 //4.设置显示的模式:左侧菜单+主页,左侧菜单+主页面+右侧菜单;主页面+右侧菜单
slidingMenu.setMode(SlidingMenu.LEFT); //5.设置滑动模式:滑动边缘,全屏滑动,不可以滑动
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); DisplayMetrics outmetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outmetrics);
screeWidth = outmetrics.widthPixels;
screeHeight = outmetrics.heightPixels;
//6.设置主页占据的宽度
// slidingMenu.setBehindOffset(DensityUtil.dip2px(MainActivity.this, 200));
slidingMenu.setBehindOffset((int) (screeWidth*0.625));
} private void initFragment() {
//1.得到FragmentManger
FragmentManager fm = getSupportFragmentManager();
//2.开启事务
FragmentTransaction ft= fm.beginTransaction();
//3.替换
ft.replace(R.id.fl_main_content,new ContentFragment(), MAIN_CONTENT_TAG);//主页
ft.replace(R.id.fl_leftmenu, new LeftmenuFragment(), LEFTMENU_TAG);//左侧菜单
//4.提交
ft.commit(); // getSupportFragmentManager().beginTransaction().replace(R.id.fl_main_content,new ContentFragment(), MAIN_CONTENT_TAG).replace(R.id.fl_leftmenu,new LeftmenuFragment(), LEFTMENU_TAG).commit(); } }

2、BaseFragment:初始化视图和数据的基本类

package com.vitoyan.myangtzeu.base;

import android.app.Activity;
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; /**
* 作者:Vito-Yan
* 作用:基本的Fragment,LeftMenuFragment和ContentFragment将继承它
*/
public abstract class BaseFragment extends Fragment { public Activity context;//MainActivity /**
* 当Fragment被创建的时候回调这个方法
* @param savedInstanceState
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
} /**
* 当视图被创建的时候回调
* @param inflater
* @param container
* @param savedInstanceState
* 创建了视图
* @return
*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return initView();
} /**
* 让孩子实现自己的视图,达到自己特有的效果
* @return
*/
public abstract View initView() ;
/**
* 当Activity被创建之后被回调
* @param savedInstanceState
*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
} /**
* 1.如果自页面没有数据,联网请求数据,并且绑定到initView初始化的视图上
* 2.绑定到initView初始化的视图上
*/
public void initData() { }
}

3、ContentFragment:正文 Fragment,重写了initView和initData

package com.vitoyan.myangtzeu.fragment;

import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView; import com.vitoyan.myangtzeu.base.BaseFragment;
import com.vitoyan.myangtzeu.utils.LogUtil; /**
* 作者:Vito-Yan
* 作用:正文Fragment
*/
public class ContentFragment extends BaseFragment { private TextView textView; @Override
public View initView() {
LogUtil.e("正文视图被初始化了");
textView = new TextView(context);
textView.setTextSize(23);
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.BLACK);
return textView;
} @Override
public void initData() {
super.initData();
LogUtil.e("正文数据被初始化了");
textView.setText("正文页面");
} }

4、LeftmenuFragment:左侧菜单的Fragment,继承自BaseFrament,重写了initView和initData

package com.vitoyan.myangtzeu.fragment;

import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView; import com.vitoyan.myangtzeu.base.BaseFragment;
import com.vitoyan.myangtzeu.utils.LogUtil; /**
* 作者:Vito-Yan
* 作用:左侧菜单的Fragment
*/ public class LeftmenuFragment extends BaseFragment { private TextView textView; @Override
public View initView() {
LogUtil.e("左侧菜单视图被初始化了");
textView = new TextView(context);
textView.setTextSize(23);
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.WHITE);
return textView;
} @Override
public void initData() {
super.initData();
LogUtil.e("左侧菜单数据被初始化了");
textView.setText("左侧菜单页面");
}
}

5、LogUtil日志工具类

6、build.gradle:在引入别人项目后注意SDK编译版本的一致性。。。

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
buildToolsVersion '26.0.1'
defaultConfig {
applicationId "com.vitoyan.myangtzeu"
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
} dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile project(':SlidingMenu_library')
}

AndroidManifest.xml还有Layout布局可以在我的github上查看

我的长大app开发教程第一弹:Fragment布局,到此结束。

我的长大app开发教程第一弹:Fragment布局的更多相关文章

  1. 我的长大app开发教程第二弹:完成ContentFragment底部按钮

    在开始之前,先上一张效果图 突然发现有点知乎的味道...的确..知乎灰#989898,知乎蓝15,136,235(逃.... 1.学P图 想我大一的时候也用过不少Adobe的软件,昨天重新打开我的Ph ...

  2. 我的长大app开发教程第三弹:实现四个子页面绑定RadioButton

    在开始之前先上一张图 在上一节中我们实现了底部Button,这一弹我们要实现点击四个按钮分别切换到不同页面,我们可以把页面分为两部分,顶部栏和中间内容部分,我们可以通过线性布局包裹两部分内容,顶部栏又 ...

  3. EnjoyingSoft之Mule ESB开发教程第一篇:初识Mule ESB

    目录 1. Mule ESB基本介绍 2. Mule ESB社区版和企业版 3. Mule ESB常用场景 4. Mule ESB软件安装 客户端安装 服务端安装 5. 第一个Mule ESB应用- ...

  4. linux下开发c第一弹--相关环境需求

    我用的是mac,mac和linux一般集成了一定的开发环境,基本上需要gcc.vim.gdb之类的,linux下需要apt-get,mac下homebrew的brew install都可以解决问题.同 ...

  5. DuiVision开发教程(18)-弹出窗

    DuiVision的弹出窗体类CDlgPopup,是菜单.下拉列表等控件的父类,也能够单独使用,用于创建弹出窗体.弹出窗体默认是非激活状态下自己主动关闭,比如鼠标点击到弹出窗体外面的区域,弹出窗体就会 ...

  6. Delphi XE8 iOS与Android移动应用开发(APP开发)教程[完整中文版]

    https://item.taobao.com/item.htm?id=536584650957&toSite=main

  7. android模块化app开发笔记-2插件间布局文件共享

    android编程时布局文件,图片资源等都是放在同一个文件夹下,这样照成一个问题就是我们想重用UI布局文件和图片时就还需要其分离这些资料,相信大部分android程序员都遇到过这样的问题,其痛苦程度不 ...

  8. app开发,H5+CSS3页面布局小tips

    1.inline-block使用后带来的间隔影响 2.竖线的处理 3.ssh公匙 4.星星组件的巧妙用法 5.api.js的$api对象与 安卓原生引擎的api对象,均相当于jQuery的$对象 6. ...

  9. EnjoyingSoft之Mule ESB开发教程系列第五篇:控制消息的流向-数据路由

    目录 1. 使用场景 2. 基于消息头的路由 2.1 使用JSON提交订单的消息 2.2 使用XML提交订单的消息 2.3 使用Choice组件判断订单格式 3. 基于消息内容的路由 4. 其他控制流 ...

随机推荐

  1. java8新特性-默认方法

    作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...

  2. PIC单片机基础1

    1.PIC单片机总线结构——哈佛结构:即指令和数据空间是完全分开的,所以与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度.以PIC16F684单片机为例,数据总线是8位的,但指令总线位数 ...

  3. About A Scam

    事件起因 本篇记录一个我遇到一个诈骗故事. 这两年我陆续有收到邮件,内容为有一大笔遗产我可以继承,让我提供银行卡号,身份证号相关信息. 后面邮件的内容就变为,有一笔公益款项,可以用我名义去管理,让我提 ...

  4. hadoop wordcout测试

    hadoop wordcout测试 安装好hadoop 环境后,启动HDFS等服务:输密码 1004 start-all.sh 查看启动情况 1006 jps 1007 cd ~ 切换到用户默认目录 ...

  5. 前端之DOM

    老师的博客:https://www.cnblogs.com/liwenzhou/p/8011504.html DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方 ...

  6. 作业MyCP中无法命令行输入的问题解决

    问题 上网搜了好久,发现是我当时安装JDK时安装了多个版本的JDK javac -version.java -version发现版本不一样 解决 删掉多余的JDK,并在环境变量Path中找到目录,删掉 ...

  7. Shell中数组的使用

    数组是一个很有用的数据结构,经常使用的功能有初始化,遍历,查找,获取数组长度等操作 一.初始化 小括号中使用空格分开的数据结构就是一个数组,也可使用下标添加元素 arr=(1 'nice' '2day ...

  8. 自然人税收管理系统扣缴客户端Sqlite数据库有密码的,如何破解读取呢

    https://www.cnblogs.com/Charltsing/p/EPPortal.html 有人问我能不能直接读自然人税收管理系统扣缴客户端,因为需要导出数据做处理. 看了一下,这个客户端是 ...

  9. 初识Haskell 三:函数function

    对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 函数毫无疑问是函数式语言的核心. 在Ha ...

  10. Python进阶7--正则表达式

    正则表达式*** 概述 分类 基本语法  元字符 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符. [.. ...