通过ID检索片段时发生NullPointerException

时间:2019-01-08 14:03:11

标签: android android-fragments

我正在尝试从外部调用给定片段的功能:从主要活动和同一级别的另一个片段中调用。在这两种情况下,使用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)

3 个答案:

答案 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()....