標籤:手機商城第一天 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的使用