Android开发中关于Fragment和Activity

最近学习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关联被取消时调用
注意:除了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;
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值