正如标题所述,我正在尝试通过按钮从另一个 fragment 启动 fragment 。这应该不是一项太难的任务,但是,我在这里很挣扎。当我单击按钮启动 fragment 时,它只是给我一个默认的 fragment 屏幕,而不是我制作的屏幕。
我不 100% 确定目前要做什么
确保 .OnFragmentInteractionListener 已在我的 fragment 的主要 Activity 中实现
尝试加载已知良好的 fragment ,但失败。让我相信我没有正确启动 fragment 。
没有出现错误
更新:尝试实现接口(interface)以与 Activity 中的 fragment 进行通信。在 Activity 上实现了接口(interface),但是,我需要在从 fragment 触发 OnClick 时调用 fragOut() 方法。不确定要做什么,之前没有使用过接口(interface)。
更新2:制作界面并尝试让它启动我的方法来启动另一个 fragment 。但是,我在尝试调用该方法时收到此错误
更新3:在这里制作界面Using an interface to communicate from fragment to activity并将创建 fragment 所需的所有内容都插入 Activity 中的接口(interface)方法调用中。
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)
来自 fragment 托管按钮的 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);
}
在主要 Activity 上实现的接口(interface)
@Override
public void fragOut() {
NewBattleFrag test = new NewBattleFrag();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.home_content,test);
transaction.addToBackStack(null);
transaction.commit();
}
最佳答案
我知道这可能意味着很多工作,但你可以改变你的实现。据我所知,您正在尝试从 fragment 内部更改 fragment 。如果您问我,更改 fragment 是主机 Activity 的工作(如果您不使用 mvp 或 mvvm)。
这可以使用界面轻松实现。在 fragment 中创建一个界面,如下所示:
public interface myInterface {
void myMethod();
}
当您在 Activity 中实例化 fragment 时(您的 Activity 应该实现您的接口(interface)),将“this”作为引用传递,以便 fragment 知道接口(interface)应该在请求时与 Activity 进行通信。这样你实际上就可以让Host Activity来处理它自己的进程来改变fragment
// 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();
您收到的空白屏幕可能是由于在 fragment 内更改 fragment 时发生错误造成的,当您请求 fragment 转换时,LogCat 中可能有一些信息可以帮助您理解问题。
祝你好运!
关于java - 从 fragment 启动 fragment 会显示默认屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56633033/