在接下来的一段时间里我会发布一个相对连续的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. MyDAL - is null && is not null 条件 使用

    索引: 目录索引 一.API 列表 C# 代码中 instance.property == null 生成 SQL 对应的 is null : 如:.Queryer<Agent>() .. ...

  2. Lua rawget rawset newindex 函数定义和例子

    在绝大多数情况下,我们都不会用到rawget和rawset. 本文的运行环境:lua 5.3 for windows rawset 赋值操作 rawset是在设置值的过程,进行处理,比如:当某个值改变 ...

  3. Active Directory Replication(复制)

    KCC(The Knowledge Consistency Checker)知识一致性检查器是一个内置的程序,在所有与管理器上运行,为林创建复制拓扑.默认,KCC15分钟间隔运行一次,根据当时存活的最 ...

  4. ERROR:"org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /config/topics/test" when creating or deleting Kafka operations authorized through the Ranger policies

    PROBLEM DESCRIPTION When creating or deleting topics in Kafka, they cannot be authorized through the ...

  5. Kafka Frequently Asked Questions

    This is intended to be an easy to understand FAQ on the topic of Kafka. One part is for beginners, o ...

  6. SQL insert into select 语句

    遇到权限数据变更的需要批量到别的平台, 在175平台添加一个权限需要, 批量到别的现有平台, 以后的建站, 会把sql放到自动建站里面; 权限的 insert into select 表一: `ous ...

  7. java8 list转map,list集合中的元素的属性转set,list集合中对象的属性转list

    一.使用java8对list操作 1.1list转map private Map<String, Member> getMemberMap() { List<Member> m ...

  8. Golang 入门 : 打造开发环境

    工欲善其事,必先利其器!在学习和使用 Golang 时如果有一款得心应手的 IDE,相信一定可以事半功倍.虽然很多 IDE 都提供了对 Golang 的支持,但真正好用的没几个.VSCode 算是不错 ...

  9. C#字符串和ASCII码的转换

    //字符转ASCII码: public static int Asc(string character) { if (character.Length == 1) { System.Text.ASCI ...

  10. 关于vue build时一直报错

    真鸡儿坑,截图说下是什么错: 像上面这种,一大堆,看不出具体是为什么,然后根据网上搜到的教程注释了webpack.base.conf.js里的某一行: 重新build,成功.......... 醉了啊 ...