关于学习Android Fragment与Activity的通信所遇到的问题

关于Fragment与Activity通信遇到的问题

定义一个Fragment与Activity通信的接口

  1. 定义了一个IFragmentCallback接口来对Fragment与Activity进行一个通信,一个是Fragment发信息给Activity,另外一个是Activity发送信息给Fragment
public interface IFragmentCallback {
    void sendMsgToActivity(String msg);
    String getMsgFromActivity(String msg);
}

  1. 创建一个点击按钮之后要发送信息到Activity之中去就要调用fragmentCallback接口对象去发送
    private IFragmentCallback fragmentCallback;

    public void setFragmentCallback(IFragmentCallback callback){
        fragmentCallback =  callback;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        if (rootview == null){
            rootview = inflater.inflate(R.layout.fragment_blank1, container, false);
        }
        Button btn = rootview.findViewById(R.id.btn2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                fragmentCallback.sendMsgToActivity("邓婕是我的");
            }
        });
         return rootview;
    }
  1. 此时的sendMsgToActivity是爆红的,这个问题对于初学者的我是相当难受的,我跟着视频中的代码一模一样,但是就是我这里爆红,但后来被我稀里糊涂的搞没了,搞没了的代码是这样的
 private com.gjk.fragmentmanager.IFragmentCallback fragmentCallback;

    public void setFragmentCallback(IFragmentCallback callback){
        fragmentCallback =  (com.gjk.fragmentmanager.IFragmentCallback)callback;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        if (rootview == null){
            rootview = inflater.inflate(R.layout.fragment_blank1, container, false);
        }
        Button btn = rootview.findViewById(R.id.btn2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                fragmentCallback.sendMsgToActivity("邓婕是我的");
            }
        });
         return rootview;
    }

  1. 后来回过头来发现多了的代码部分就是接口的本地路径……但是视频教程中并没有这么写,这个我希望如果有大神看到这篇文章的时候能够稍加提点 则感激不尽……

Fragment与Activity建立通信之后在虚拟机上运行闪退

  1. 根据视频的节奏写出了一个小功能,点击按钮后会在页面上显示一句话
    在这里插入图片描述
  2. 但是我在运行时却闪退,并且在Running区域报错、错误代码如下:
 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.gjk.fragmentmanager, PID: 4407
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.gjk.fragmentmanager.BlankFragment1.onCreateView(BlankFragment1.java:35)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 4407 SIG: 9

  1. 关于这个问题的解决还真是挺凑巧的,竟然在写这篇文章的时候发现问题解决的,回顾一下报错信息 : java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)’ on a null object reference
    尝试在一个空对象引用上调用虚拟方法,那么回顾代码
 private com.gjk.fragmentmanager.IFragmentCallback fragmentCallback;

    public void setFragmentCallback(IFragmentCallback callback){
        fragmentCallback =  (com.gjk.fragmentmanager.IFragmentCallback)callback;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        if (rootview == null){
            rootview = inflater.inflate(R.layout.fragment_blank1, container, false);
        }
        Button btn = rootview.findViewById(R.id.btn2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                fragmentCallback.sendMsgToActivity("邓婕是我的");
            }
        });
         return rootview;
    }

经过一系列的回调,发现是fragment_blank1.xml文件中Button按钮的id搞错了……
自己感觉也是挺无语的……
如果大家想看源码
就私信我吧……

本人Android初学者,小白一个,如果出现什么错误,望见谅并指正出来……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrblackgod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值