最近学习Android遇到一个困难,activity和fragment通信的问题,幸亏有大神指导,自己才能很快的了解其中的方法...下面我将这个方法分享,希望能对各位有所帮助。(PS:我是第一次写博客,哪里不对的请多多谅解,感谢)
1
. 生命周期
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期:
(这里引用官网的声明周期说明一下)
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现
2.使用:
1>. 定义布局文件:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
//。。。
---------------------------------------------------------------------------------------------------
2>在MainActivity中:1.初始化
2.对于每一个包含ImageView和TextView的LinearLayout设置点击监听
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.messageTab:
//替换成 MessageFragment
setSelect(MESSAGE);//通过静态数据执行传入判断是哪一个点击
break;
//...
default:
break;
}
}
private void setSelect(int tab) {
FragmentManager fm = getSupportFragmentManager();//创建FragmentManager
FragmentTransaction transaction = fm.beginTransaction();//创建事务
resetResource();//还原原本配置
switch (tab){
case MESSAGE:
if(messageFragment == null){
messageFragment = new MessageFragment();//创建MessageFragment继承Fragment,实现onCreateView方法进行初始化数据操作
}
transaction.replace(R.id.container, messageFragment);//当事件点击之后,进行图片的替换,整个container进行替换
messageLogo.setImageResource(R.mipmap.chat_focus);//设置图片
messageText.setTextColor(getResources().getColor(R.color.colorPrimary));//改变字体颜色
break;
//。。。。
default:
break;
}
transaction.commit();//提交
}
//还原配置
private void resetResource() {
messageLogo.setImageResource(R.mipmap.chat_unfocus);
contactLogo.setImageResource(R.mipmap.contact_unfocus);
coverLogo.setImageResource(R.mipmap.cover_unfocus);
mineLogo.setImageResource(R.mipmap.mine_unfocus);
messageText.setTextColor(getResources().getColor(R.color.bottom_text));
contactText.setTextColor(getResources().getColor(R.color.bottom_text));
coverText.setTextColor(getResources().getColor(R.color.bottom_text));
mineText.setTextColor(getResources().getColor(R.color.bottom_text));
}
---------------------------------------------------------------------------------------------------
3> 要是想在Fragment开启一个Activity,Fragment本身不能做到这个事情,必须交给其父Activity进行开启另外的Activity,其用法是令Fragment和其父Activity实现相同的接口;这里就需要去定义一个接口
public interface FragmentCommunication {
void startActivity(int activityName);
}
让MainActivity实现这个接口,在Fragment中private FragmentCommunication communication;
然后在Fragment中重写onAttach(
Context context
)--(此方法是在Activity创建Fragment时调用的方法)方法,用
communication = (FragmentCommunication) context;
对于Fragment与Activity进行绑定,这样Fragment就可以知道向那个Activity发送请求数据,然后有其父Activity进行启动另外的Activity即:
communication.startActivity(ActivityStatic.LOGIN_ACTIVITY);//
ActivityStatic.LOGIN_ACTIVITY为Activity标识,用于标记Fragment想启动哪一个Activity实现
FragmentCommunication接口的方法中,以Activity标识进行判断启动哪一个Activity
//MainActivity实现自定义接口的方法,可以由此调用另外的Activity
@Override
public void startActivity(int activityName) {
switch (activityName){
case ActivityStatic.LOGIN_ACTIVITY:
Toast.makeText(MainActivity.this, "我要启动Login!", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}