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