标签:手机商城第一天 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的使用
标签:手机商城第一天 loading界面 主界面与basefragment的创建 bufferknife的使用
原文地址:http://cm0425.blog.51cto.com/10819451/1953464