从片段中启动片段会显示默认屏幕

时间:2019-06-17 14:07:52

标签: java android android-fragments

如标题所述,我正在尝试通过按钮从另一个片段中启动一个片段。这不应该太难,但是,我在这里苦苦挣扎。当我单击按钮启动片段时,它只是给我一个默认的片段屏幕,而不是我创建的屏幕。

我不是100%不确定当前该怎么做

  1. 确保在片段的主要活动中实现了.OnFragmentInteractionListener

  2. 试图加载已知良好的片段,但失败了。使我相信我没有正确启动该片段。

  3. 没有错误出现

更新:尝试实现与活动片段通信的接口。在活动上实现了接口,但是当片段触发OnClick时,我需要调用fragOut()方法。不确定以前该如何处理接口。

Update2:制作接口并尝试使其启动我的方法,该方法将启动另一个片段。但是,尝试调用方法时出现此错误

Update3:在Using an interface to communicate from fragment to activity处创建接口,并推挤在活动中的接口方法调用中创建片段所需的一切。

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:
        {

        }
    }
}

在Fragment托管按钮上创建的界面

   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();

}

1 个答案:

答案 0 :(得分:1)

我知道这可能意味着很多工作,但是您可以更改实现。据我所知,您正在尝试从片段中更改片段。如果您问我,更改片段是主机活动的工作(如果您未使用mvp或mvvm)。

使用界面可以轻松实现。在片段中创建一个接口,如下所示:

public interface myInterface {
    void myMethod();
}

在实例化活动中的片段时(您的活动应实现您的接口),请传递“ this”作为参考,以便Fargfa知道接口应在被请求时与Activity进行通讯。这样,您实际上可以让Host Activity处理自己的更改片段的过程

// 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中会有一些信息,可以帮助您理解问题。

祝你好运!