之前的手机影音经过这2天的总结,又从新掌握了不少之前忘记的知识,加深了对于知识的印象,下面的这个是一个新的项目,商城APP,有用到很多旧的知识,当然又有很多新的知识等着我去挑战、学习。

        代码托管到码云上,有兴趣的可以去下载看看

    

    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

            

    
        
        
    

    而我们在触碰到屏幕后,马上跳转,如果不做处理,那么handler的那个2秒延迟也会跳转到MainActivity,相当于打开了2个。在这里设置MainActivity 的启动模式为singleTask,即在Task栈中,只会存在一个Activity。

    

2、MainActivity 

        a 布局文件

        这个布局与上个项目手机影音类似,都是最外边是一个LinearLayout,竖直方向排版。

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

    

    
    
        
        
        
        
        

        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的生命周期

    由于图片比较模糊,可以参考博客:

        自定义的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方法调用