如标题所述,我正在尝试通过按钮从另一个片段中启动一个片段。这不应该太难,但是,我在这里苦苦挣扎。当我单击按钮启动片段时,它只是给我一个默认的片段屏幕,而不是我创建的屏幕。
我不是100%不确定当前该怎么做
确保在片段的主要活动中实现了.OnFragmentInteractionListener
试图加载已知良好的片段,但失败了。使我相信我没有正确启动该片段。
没有错误出现
更新:尝试实现与活动片段通信的接口。在活动上实现了接口,但是当片段触发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();
}
答案 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中会有一些信息,可以帮助您理解问题。
祝你好运!