android butterknife 延迟绑定,手机商城第一天 loading界面,主界面与baseFragment的创建,Bufferknife的使用...

之前的手机影音经过这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。

android:name=".activity.MainActivity"

android:launchMode="singleTask">

2、MainActivity

a 布局文件

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

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

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"

>

android:id="@+id/framelayout"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

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">

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"/>

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"/>

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"/>

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"/>

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"/>

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方法调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值