我正在尝试从外部调用给定片段的功能:从主要活动和同一级别的另一个片段中调用。在这两种情况下,使用findFragmentById检索的片段都是null。我也尝试过使用findFragmentByTag,但结果相同。
调用目标片段功能
FragmentManager fm = getFragmentManager();//if added by xml
MainFragmentLDash2 myFragment = (MainFragmentLDash2) getFragmentManager().findFragmentById(R.id.fd2);
if(myFragment == null){
Toast.makeText(getContext(), "null", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getContext(), "ok", Toast.LENGTH_LONG).show();
myFragment.mediaDraw();
}
我要致电的目标片段中的功能
public void mediaDraw() {
Toast.makeText(getContext(), "drawFRAGMENT2", Toast.LENGTH_SHORT).show();
}
框架的XML
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fd2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@color/transparent"
android:descendantFocusability="beforeDescendants"
android:fillAfter="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:fromYScale="0.0"
android:gravity="center_vertical"
android:tag="firstFragmentWrapperDash2">
</FrameLayout>
LOGCAT
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.widget.Toast.<init>(Toast.java:109)
at android.widget.Toast.makeText(Toast.java:268)
at design.ubris.myuni.MainFragmentLDash2.mediaDraw(MainFragmentLDash2.java:101)
at design.ubris.myuni.MainFragmentLSegr1.OnAsyncTaskComplete(MainFragmentLSegr1.java:171)
at design.ubris.myuni.URLDataReader.onPostExecute(URLDataReader.java:112)
at design.ubris.myuni.URLDataReader.onPostExecute(URLDataReader.java:26)
at android.os.AsyncTask.finish(AsyncTask.java:692)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:709)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
答案 0 :(得分:0)
发生这种情况是因为尚未将片段添加到片段堆栈中。
确保您这样做:
MainFragmentLDash2 myFragment = new MainFragmentLDash2();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.fd2, myFragment).commit();
现在您可以调用片段方法
myFragment.mediaDraw();
答案 1 :(得分:0)
或者您可以使用findFragmentByTag
:
getSupportFragmentManager().findFragmentByTag( "PREFS_FRAGMENT" );
只要确保在创建片段时传递标签:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, new YourFragment(), "PREFS_FRAGMENT")
.commit();
答案 2 :(得分:0)
从您随附的日志中,您似乎会收到在{strong> Toast 创建中传递的上下文的NullPointerExeception
。
Toast.makeText(getContext().....
您需要将 getContext()替换为 getActivity(),如下所示:
Toast.makeText(getActivity()....