1. 程式人生 > >手機商城第一天 loading界面,主界面與baseFragment的創建,Bufferknife的使用

手機商城第一天 loading界面,主界面與baseFragment的創建,Bufferknife的使用

手機商城第一天 loading界面 主界面與basefragment的創建 bufferknife的使用

之前的手機影音經過這2天的總結,又從新掌握了不少之前忘記的知識,加深了對於知識的印象,下面的這個是一個新的項目,商城APP,有用到很多舊的知識,當然又有很多新的知識等著我去挑戰、學習。

代碼托管到碼雲上,有興趣的可以去下載看看

https://git.oschina.net/joy_yuan/ShoppingMall


1、創建loading界面

loading界面說白了就是一個簡單布局的activity,在這個activity的oncreate方法裏,利用handler發送一個延遲2秒的intent,跳轉到主Activity裏,註意在跳轉後,finish()掉這個activity。

註意這裏有onTouchEvent回調事件,就是我們之前上個項目手機影音裏的功能,在loading界面觸碰下屏幕,馬上跳轉到主頁面。

package com.yuanlp.shoppingmall.activity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;

import com.yuanlp.shoppingmall.R;

public class SplashActivity extends AppCompatActivity {

;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

       new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startToActivity();
            }
        }, 2000);
    }

    private void startToActivity() {
        Intent intent=new Intent(SplashActivity.this,MainActivity.class);
        this.startActivity(intent);
        finish();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        startToActivity();
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

此時需要在AndroidManifext.xml裏註冊啟動的activity是SplashActivity

<activity android:name=".activity.SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>


而我們在觸碰到屏幕後,馬上跳轉,如果不做處理,那麽handler的那個2秒延遲也會跳轉到MainActivity,相當於打開了2個。在這裏設置MainActivity 的啟動模式為singleTask,即在Task棧中,只會存在一個Activity。

<activity
    android:name=".activity.MainActivity"
    android:launchMode="singleTask">
</activity>


2、MainActivity

a 布局文件

這個布局與上個項目手機影音類似,都是最外邊是一個LinearLayout,豎直方向排版。

在LinearLayout裏有2個子布局,上面是FrameLayout,下面是一個RadioGroup.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:background="#ffffff"
    android:orientation="vertical"
    tools:context="com.yuanlp.shoppingmall.activity.MainActivity"
    >

    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <RadioGroup
        android:id="@+id/rg_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@drawable/home_bottom_parent_bg"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/rb_home"
            android:text="主頁"
        android:drawableTop="@drawable/home_button_selector"
        style="@style/MainButtonStyle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

        <RadioButton
            android:id="@+id/rb_type"
            android:text="分類"
            android:drawableTop="@drawable/type_button_selector"
            style="@style/MainButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <RadioButton
            android:id="@+id/rb_community"
            android:text="發現"
            android:drawableTop="@drawable/community_button_selector"
            style="@style/MainButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <RadioButton
            android:id="@+id/rb_cart"
            android:text="購物車"
            android:drawableTop="@drawable/cart_button_selector"
            style="@style/MainButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <RadioButton
            android:id="@+id/rb_user"
            android:text="購物車"
            android:drawableTop="@drawable/user_button_selector"
            style="@style/MainButtonStyle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</RadioGroup>

</LinearLayout>

b、在activity裏,如果要一個一個的手動去實例化控件,比較麻煩,如果有更加復雜的布局,那麽手動寫起來很累,就需要用到ButterKnife插件。

在build.gradle裏加入如下,aysn一下即可加入

        compile ‘com.jakewharton:butterknife:8.7.0‘
  annotationProcessor ‘com.jakewharton:butterknife-compiler:8.7.0‘

然後在Mainactivity裏就可以使用,默認先選中主頁home這個radiobutton

package com.yuanlp.shoppingmall.activity;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.yuanlp.shoppingmall.R;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends FragmentActivity {

    @BindView(R.id.framelayout)
    FrameLayout mFramelayout;
    @BindView(R.id.rb_home)
    RadioButton mRbHome;
    @BindView(R.id.rb_type)
    RadioButton mRbType;
    @BindView(R.id.rb_community)
    RadioButton mRbCommunity;
    @BindView(R.id.rb_cart)
    RadioButton mRbCart;
    @BindView(R.id.rb_user)
    RadioButton mRbUser;
    @BindView(R.id.rg_main)
    RadioGroup mRgMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //綁定butterknife與activity,實例化控件
        ButterKnife.bind(this);

        mRgMain.check(R.id.rb_home);

    }
}

3 因為要通過下方的radiobutton的選中來切換上面的Fragment,就需要寫一個BaseFragment。

比較下Activity與Fragment的生命周期

由於圖片比較模糊,可以參考博客:http://blog.csdn.net/forever_crying/article/details/8238863/

自定義的Fragment繼承Fragment,一定要導的是V4包裏的

自定義的Fragment至少要重寫3個方法

1、onCreate 子類要用到context,需要在這裏獲取

2、onCreateView 這裏是展示給頁面UI的地方,展示的是return的View

3、onActivityCreated 這裏是activity被創建好之後回調,在這裏可以初始化自定義view,獲取Fragment裏的數據

package com.yuanlp.shoppingmall.base;


import android.content.Context;
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;

/**
 * 基本的Fragement,其他幾個頁面都要繼承這個基類
 * 繼承fragment必須重寫至少3個方法,
 *  1、onCreate  獲取context
 *  2、onCreateView  展示UI布局
 *  3、onActivityCreated  初始化各種空間,獲取數據等
 */
public abstract class BaseFragement extends Fragment {

    protected Context context;

    /**
     * onCreate是指創建該fragment,類似於Activity.onCreate,你可以在其中初始化除了view之外的東西;
     * @param savedInstanceState
     */
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context=getActivity();
    }

    /**
     * onCreateView是創建該fragment對應的視圖,你必須在這裏創建自己的視圖並返回給調用者。負責UI的創建顯示
     * @param inflater
     * @param container
     * @param savedInstanceState
     * @return
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return initview();

        //如下面這個代碼就是在home主頁面時,inITview裏,return這個view來展示這個布局
        // View view = View.inflate(mContext, R.layout.fragment_home, null);

    }

    /**
     * 強制子類實現他,讓在oncreateview裏顯示這個布局。
     * @return
     */
    public abstract View initview();


    /**
     * 當activity被完全啟動時回調,在這裏初始化自定義的view。 這裏負責數據獲取
     * @param savedInstanceState
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        initData();
    }

    /**
     * 當子類需要聯網獲取數據時,可以重寫該方法
     */
    public void initData() {

    }



}


附一個關於onCreateView 與onActivityView 的區別解釋:

    android開發—Fragment中onCreateView()和onActivityCreated()的區別
    ①靜態的view不需要onActivityCreated 
    ②保存view的狀態的時候需要用onActivityCreated 
    ③訪問父activity的view層的時候需要在onActivityCreated 方法裏面做 
    即如果view是靜態的,那麽沒有必要在onActivityCreated 方法去調用,大多數的自定義的view,初始化時都需要一個context,而activity是context的子類,所以在onCreateView方法的時候非靜態的view初始化調用可能出現異常,所以對於非靜態的view,最好在onActivityCreated方法調用


本文出自 “YuanGuShi” 博客,請務必保留此出處http://cm0425.blog.51cto.com/10819451/1953464

手機商城第一天 loading界面,主界面與baseFragment的創建,Bufferknife的使用