個人長大app開發教程第一彈:Fragment佈局

在接下來的一段時間裏我會發佈一個相對連續的Android教程,這個教程會講述我是如何從零開始開發「個人長大」這個Android應用。android

在開始以前,我先來介紹一下「個人長大」:這是一個校園社交app,準確點說是一個資訊+社交的校園app。目標用戶是在校大學生,老師。項目初期提供的功能有:校園資訊,校園服務,校園問答,核心的社交功能會在稍後視狀況推出。咱們的競爭對手有微信,QQ,空間,微博,知乎。。。等殺手級應用,因此咱們壓力仍是有點大,可是,還有機會(逃。。。當我沒說。git

具體的產品構思和運營方案會在項目後期發佈。。。程序員

現現在,有人說移動互聯網已死,接下來是AI的時代,或者更準確的說移動互聯網的紅利期已通過去,下一個經濟爆發點在AI領域。。github

先不說咱們可否準確的揣測這個時代的發展,可是有些現象很真實:從2015下到2016開始,Android低端程序員過剩,app的裝機量已經停滯不前,App的推廣成本愈來愈高,微信微博等巨頭把控着移動端的流量入口,資本熱度逐漸退去,初創公司融資困難,移動端的寒潮來臨。2000年PC互聯網泡沫,08年全球金融危機,隨後幾年移動互聯網蓬勃發展,這幾年移動遇冷,資本市場疲憊,創業愈來愈難,無獨有偶,近年來大數據和人工智能又大行其道。。。不禁得開始思考,這種種背後是技術的必然發展,仍是資本的時代博弈。。。編不下去了。。。逃。。微信

下面開始正題。。。app

我使用的開發工具是Android Studio 2.3.3框架

工程結構:ide

最終達到的效果:側滑功能使用了第三方庫SlidingMenu,能夠自行在github下載,也能夠直接copy個人(https://github.com/Vito-Yan/MYangtzeu)工具

具體的實現步驟:佈局

一、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();



    }

}

二、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() {

    }
}

三、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("正文頁面");
    }

}

四、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("左側菜單頁面");
    }
}

五、LogUtil日誌工具類

六、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佈局,到此結束。

相關文章
相關標籤/搜索