Java 从 Activity 调用 Fragment 方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24229398/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 10:57:04  来源:igfitidea点击:

Call Fragment method from Activity

javaandroidandroid-fragmentsonresume

提问by carlosdiazp

I need to call a method inside a fragment in onResume activity, but always shows FC with this error:

我需要在 onResume 活动的片段内调用一个方法,但始终显示 FC 并显示此错误:

06-15 14:59:58.496: E/AndroidRuntime(28904): FATAL EXCEPTION: main
06-15 14:59:58.496: E/AndroidRuntime(28904): Process: com.carlosdiaz.tfm_usuarios, PID: 28904
06-15 14:59:58.496: E/AndroidRuntime(28904): java.lang.RuntimeException: Unable to resume activity {com.carlosdiaz.tfm_usuarios/com.carlosdiaz.tfm_usuarios.Grupos}: java.lang.NullPointerException
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2774)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.access0(ActivityThread.java:135)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.os.Handler.dispatchMessage(Handler.java:102)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.os.Looper.loop(Looper.java:136)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.main(ActivityThread.java:5001)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at java.lang.reflect.Method.invokeNative(Native Method)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at java.lang.reflect.Method.invoke(Method.java:515)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at dalvik.system.NativeStart.main(Native Method)
06-15 14:59:58.496: E/AndroidRuntime(28904): Caused by: java.lang.NullPointerException
06-15 14:59:58.496: E/AndroidRuntime(28904):    at com.carlosdiaz.tfm_usuarios.Grupos.onResume(Grupos.java:52)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.Activity.performResume(Activity.java:5310)
06-15 14:59:58.496: E/AndroidRuntime(28904):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2764)
06-15 14:59:58.496: E/AndroidRuntime(28904):    ... 12 more

I don't know what can I do.

我不知道我能做什么。

This is mi OnCreate & onResume methods:

这是 mi OnCreate & onResume 方法:

public class Grupos extends Activity {

    PlaceholderFragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grupos);

        fragment = (PlaceholderFragment) getFragmentManager().findFragmentById(R.layout.fragment_grupos);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        Log.i("Test","Test");
        fragment.myOnResume();
    }

...

...

My method is inside the Fragment class:

我的方法在 Fragment 类中:

public static class PlaceholderFragment extends Fragment {
...
public void myOnResume() {
            GruposTask getGrupos = new GruposTask(PlaceholderFragment.this, getActivity());
            getGrupos.execute(id);
        }
...

Thank You in advance!

先感谢您!

edit:

编辑:

now im trying to create the fragment in the activity xml to call it later from oncreate() this way:

现在我试图在活动 xml 中创建片段,以便稍后从 oncreate() 以这种方式调用它:

PlaceholderFragment mainFragment = (PlaceholderFragment)getFragmentManager().findFragmentById(R.id.listGroup);

this is the activity layout:

这是活动布局:

   xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.carlosdiaz.tfm_usuarios.Grupos"
    tools:ignore="MergeRootFrame">
    <fragment class="com.carlosdiaz.tfm_usuarios.Grupos.PlaceholderFragment"
            android:id="@+id/listGroup"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
 </FrameLayout>

But now Im having this error:

但现在我有这个错误:

06-15 19:20:15.956: E/AndroidRuntime(7424): FATAL EXCEPTION: main
06-15 19:20:15.956: E/AndroidRuntime(7424): Process: com.carlosdiaz.tfm_usuarios, PID: 7424
06-15 19:20:15.956: E/AndroidRuntime(7424): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carlosdiaz.tfm_usuarios/com.carlosdiaz.tfm_usuarios.Grupos}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread.access0(ActivityThread.java:135)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.os.Looper.loop(Looper.java:136)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread.main(ActivityThread.java:5001)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at java.lang.reflect.Method.invokeNative(Native Method)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at java.lang.reflect.Method.invoke(Method.java:515)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at dalvik.system.NativeStart.main(Native Method)
06-15 19:20:15.956: E/AndroidRuntime(7424): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Activity.setContentView(Activity.java:1929)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at com.carlosdiaz.tfm_usuarios.Grupos.onCreate(Grupos.java:39)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Activity.performCreate(Activity.java:5231)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
06-15 19:20:15.956: E/AndroidRuntime(7424):     ... 11 more
06-15 19:20:15.956: E/AndroidRuntime(7424): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.carlosdiaz.tfm_usuarios.Grupos.PlaceholderFragment: make sure class name exists, is public, and has an empty constructor that is public
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Fragment.instantiate(Fragment.java:597)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Fragment.instantiate(Fragment.java:561)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Activity.onCreateView(Activity.java:4778)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
06-15 19:20:15.956: E/AndroidRuntime(7424):     ... 21 more
06-15 19:20:15.956: E/AndroidRuntime(7424): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.carlosdiaz.tfm_usuarios.Grupos.PlaceholderFragment" on path: DexPathList[[zip file "/data/app/com.carlosdiaz.tfm_usuarios-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.carlosdiaz.tfm_usuarios-2, /vendor/lib, /system/lib]]
06-15 19:20:15.956: E/AndroidRuntime(7424):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
06-15 19:20:15.956: E/AndroidRuntime(7424):     at android.app.Fragment.instantiate(Fragment.java:583)
06-15 19:20:15.956: E/AndroidRuntime(7424):     ... 24 more

采纳答案by EpicPandaForce

That is because your order is wrong.

那是因为你的顺序错了。

PlaceholderFragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grupos);

    if(savedInstanceState == null)
    {
        fragment = new PlaceHolderFragment();
        fragment.setTag(R.id.myfragmentId);
        getFragmentManager().beginTransaction()
            .add(R.id.container, fragment).commit();
    }
    else
    {
        if(fragment == null)
        {
            fragment = (PlaceholderFragment) getFragmentManager().findFragmentByTag(R.id.myfragmentId);
        }
    }
}

回答by Mahmudul Haque Khan

I think you can try FragmentActivity as like- public class Grupos extends FragmentActivitybecause Base class for activities that want to use the support-based Fragment and Loader APIs. (android.support.v4.app.FragmentActivity)

我认为您可以像尝试 FragmentActivity 一样 -公共类 Grupos 扩展 FragmentActivity因为想要使用基于支持的 Fragment 和 Loader API 的活动的基类。(android.support.v4.app.FragmentActivity)

回答by Abdulrazak Alkl

Try to use FragmentActivity instead of Activity.

尝试使用 FragmentActivity 而不是 Activity。

Then you should call getSupportFragmentManager instead of getFragmentManager

然后你应该调用 getSupportFragmentManager 而不是 getFragmentManager

Also you can't pass a layout to findFragmentById method. you should give it a fragment id (R.id.FRAGMENT_ID) instead.

您也不能将布局传递给 findFragmentById 方法。你应该给它一个片段 id (R.id.FRAGMENT_ID)。

Try make it like this:

试着让它像这样:

public class Grupos extends FragmentActivity {

PlaceholderFragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grupos);

    fragment = new PlaceholderFragment();
    getSupportFragmentManager().beginTransaction()
                .add(R.id.container, fragment).commit();
}

@Override
protected void onResume()
{
    super.onResume();
    Log.i("Test","Test");
    fragment.myOnResume();
}

回答by AzadGh

if your activty in not parentyou can use this code :

如果您的活动不在父母中,您可以使用以下代码:

final PlaceholderFragment pf = new PlaceholderFragment();
pf.your_method_name();

this code worked for me

这段代码对我有用