关于Fragment与Activity通信遇到的问题
定义一个Fragment与Activity通信的接口
- 定义了一个IFragmentCallback接口来对Fragment与Activity进行一个通信,一个是Fragment发信息给Activity,另外一个是Activity发送信息给Fragment
public interface IFragmentCallback {
void sendMsgToActivity(String msg);
String getMsgFromActivity(String msg);
}
- 创建一个点击按钮之后要发送信息到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;
}
- 此时的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;
}
- 后来回过头来发现多了的代码部分就是接口的本地路径……但是视频教程中并没有这么写,这个我希望如果有大神看到这篇文章的时候能够稍加提点 则感激不尽……
Fragment与Activity建立通信之后在虚拟机上运行闪退
- 根据视频的节奏写出了一个小功能,点击按钮后会在页面上显示一句话
- 但是我在运行时却闪退,并且在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
- 关于这个问题的解决还真是挺凑巧的,竟然在写这篇文章的时候发现问题解决的,回顾一下报错信息 : 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初学者,小白一个,如果出现什么错误,望见谅并指正出来……