Java 从碎片中发射碎片将导致显示的解除飞行屏幕

Java 从碎片中发射碎片将导致显示的解除飞行屏幕,java,android,android-fragments,Java,Android,Android Fragments,正如标题所述,我正试图通过一个按钮从另一个片段启动一个片段。这应该不是一个太难的任务,但在这里,我正在努力。当我点击按钮启动片段时,它只会给我一个默认的片段屏幕,而不是我创建的屏幕 不是100%确定当前我要做什么 确保.OnFragmentInteractionListener已在片段的主要活动中实现 试图加载已知的良好片段,但失败。让我相信我没有正确发射碎片 没有出现错误 更新:尝试实现接口以与活动中的片段通信。在活动上实现了接口,但我需要在从片段触发OnClick时调用fragOut()方法

正如标题所述,我正试图通过一个按钮从另一个片段启动一个片段。这应该不是一个太难的任务,但在这里,我正在努力。当我点击按钮启动片段时,它只会给我一个默认的片段屏幕,而不是我创建的屏幕

不是100%确定当前我要做什么

  • 确保.OnFragmentInteractionListener已在片段的主要活动中实现

  • 试图加载已知的良好片段,但失败。让我相信我没有正确发射碎片

  • 没有出现错误

  • 更新:尝试实现接口以与活动中的片段通信。在活动上实现了接口,但我需要在从片段触发OnClick时调用fragOut()方法。不确定该做什么以前没有使用过接口

    Update2:创建接口,并试图让它启动启动另一个片段的方法。但是,我在尝试调用该方法时遇到此错误

    更新3:在这里创建接口,并在活动中的接口方法调用中插入创建片段所需的所有内容

    FATAL 
        java.lang.NullPointerException: Attempt to invoke interface method
      'void   rangers.socman.BattleRhythmFrag$doubleFrag.fragOut()' on a null
       object reference
        at rangers.socman.BattleRhythmFrag.onClick(BattleRhythmFrag.java:149)
    
    来自片段宿主按钮的OnClick()

    @Override
    public void onClick(View v) {
    
    
    
        switch(v.getId()){
    
    
    
            case R.id.newBattle:
            {
              doubleFrag testFrag;     
              testFrag.fragOut();
               }
    
            case R.id.editBattle:
            {
                EditBattleFrag editBattleF = new EditBattleFrag();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,editBattleF,editBattleF.getTag()).addToBackStack(null).commit();
    
            }
    
            case R.id.deleteBattle:
            {
                DeleteBattleFrag deleteBattleF = new DeleteBattleFrag();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,deleteBattleF,deleteBattleF.getTag()).addToBackStack(null).commit();
    
            }
    
            break;
            default:
            {
    
            }
        }
    }
    
       public interface doubleFrag {
             void fragOut(Context context);
       }
    
    在片段宿主按钮上创建的接口

    @Override
    public void onClick(View v) {
    
    
    
        switch(v.getId()){
    
    
    
            case R.id.newBattle:
            {
              doubleFrag testFrag;     
              testFrag.fragOut();
               }
    
            case R.id.editBattle:
            {
                EditBattleFrag editBattleF = new EditBattleFrag();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,editBattleF,editBattleF.getTag()).addToBackStack(null).commit();
    
            }
    
            case R.id.deleteBattle:
            {
                DeleteBattleFrag deleteBattleF = new DeleteBattleFrag();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,deleteBattleF,deleteBattleF.getTag()).addToBackStack(null).commit();
    
            }
    
            break;
            default:
            {
    
            }
        }
    }
    
       public interface doubleFrag {
             void fragOut(Context context);
       }
    
    在主活动上实现的接口

        @Override
    public void fragOut() {
    
        NewBattleFrag test = new NewBattleFrag();
    
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    
        transaction.replace(R.id.home_content,test);
        transaction.addToBackStack(null);
    
        transaction.commit();
    
    }
    

    我知道这可能意味着很多工作,但你可以改变你的实现。从我看到的情况来看,您正试图从片段内部更改片段。如果您问我,那么更改片段(如果您没有使用mvp或mvvm)是主机活动的工作

    这可以通过使用接口轻松实现。在片段内部创建一个接口,如下所示:

    public interface myInterface {
        void myMethod();
    }
    
    当您在活动中实例化您的片段(您的活动应该实现您的接口)时,将“this”作为引用传递,以便片段知道接口应该在请求时与活动通信。通过这种方式,您实际上可以让宿主活动处理自己的进程来更改片段

    // Create new fragment and transaction
    Fragment newFragment = new ExampleFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    
    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);
    
    // Commit the transaction
    transaction.commit();
    
    您得到的空白屏幕可能是由于在片段中更改片段时出错,当您请求片段转换时,LogCat中可能有一些信息有助于理解问题


    祝你好运

    我很难理解你说的“这个”是什么意思。我试过两件事,但都没办法解决。我假设我的应用程序没有从接口启动是因为片段不知道如何与接口通信。