Qihoo360 / RePlugin

RePlugin - A flexible, stable, easy-to-use Android Plug-in Framework
Apache License 2.0
7.27k stars 1.53k forks source link

宿主不能显示插件的DialogFragment #779

Open jiashie opened 5 years ago

jiashie commented 5 years ago

问题详细描述 Detailed description of the problem

参照官方demo1和host,在demo1里新增加一个MyDialogFragment,在host里参照PluginFragmentActivity的方式,能够生成MyDialogFragment对象,但是fragment.show(getSupportFragmentManager(), "testdialog2");时崩溃。

android.view.WindowManager$BadTokenException: Unable to add window -- token null for displayid = 0 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:931) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:400) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:129) at android.app.Dialog.show(Dialog.java:471) at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:418)

复现问题步骤 Steps to reproduce the problem

  1. demo1里的MyDialogFragment

    public class MyDialogFragment extends DialogFragment {
    public MyDialogFragment() {
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            LayoutInflater pluginInflater = LayoutInflater.from(RePlugin.getPluginContext());
            return pluginInflater.inflate(R.layout.main_fragment, container, false);
    }
    }
  2. host里的调用代码
    private void showDialogFragment() {
        boolean isBuiltIn = true;
        String pluginName = isBuiltIn ? "demo1" : "com.qihoo360.replugin.sample.demo1";
        RePlugin.registerHookingClass("com.qihoo360.replugin.sample.demo1.fragment.MyDialogFragment", RePlugin.createComponentName(pluginName, "com.qihoo360.replugin.sample.demo1.fragment.MyDialogFragment"), null);
        //代码使用插件Fragment
        ClassLoader d1ClassLoader = RePlugin.fetchClassLoader(pluginName);//获取插件的ClassLoader
        try {
            DialogFragment fragment = d1ClassLoader.loadClass("com.qihoo360.replugin.sample.demo1.fragment.MyDialogFragment").asSubclass(DialogFragment.class).newInstance();//使用插件的Classloader获取指定Fragment实例
            //getSupportFragmentManager().beginTransaction().add(R.id.container2, fragment).commit();//添加Fragment到UI
            Log.d("showDialog", "fragment=" + fragment);
            fragment.show(getSupportFragmentManager(), "testdialog2");
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

其它重要信息 Other important information

replugin-host-lib/gradle Version: 2.3.1 rePlugin-plugin-lib/gradle Version: 2.3.1

Android API Version:- Android 手机型号&ROM(Phone model & ROM): -

Logcat上下文 Logcat context

Process: com.qihoo360.replugin.sample.host, PID: 12841 android.view.WindowManager$BadTokenException: Unable to add window -- token null for displayid = 0 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:931) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:400) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:129) at android.app.Dialog.show(Dialog.java:471) at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:418) at android.support.v4.app.Fragment.performStart(Fragment.java:2218) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1340) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710) at android.os.Handler.handleCallback(Handler.java:891) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:7539) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

jiashie commented 5 years ago

补充:群里的热心网友用同样的代码,生成apk发给我安装后可以正常显示dialogFragment。 诡异的是:卸载这个apk后,再运行之前我自己生成的demo host apk,也同样地可以正常显示了!!! 甚至连公司实际项目里原先使用Replugin遇到的这个问题也不一样了!(原先是连插件里的view都inflate不了,现在报和上面一样的log)