java - 从 fragment 启动 fragment 会显示默认屏幕

标签 java android android-fragments

正如标题所述,我正在尝试通过按钮从另一个 fragment 启动 fragment 。这应该不是一项太难的任务,但是,我在这里很挣扎。当我单击按钮启动 fragment 时,它只是给我一个默认的 fragment 屏幕,而不是我制作的屏幕。

我不 100% 确定目前要做什么

  1. 确保 .OnFragmentInteractionListener 已在我的 fragment 的主要 Activity 中实现

  2. 尝试加载已知良好的 fragment ,但失败。让我相信我没有正确启动 fragment 。

  3. 没有出现错误

更新:尝试实现接口(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/

相关文章:

android - 微调器 OnItemSelectedListener

android - fragment 中的 SimpleCursorAdapter ClassCastException

android - 显示 fragment 的 Activity 按钮

java - 错过了在 Java 8 中修复 JDBC 日期处理的机会?

java - 在java中使用键盘以角度移动圆

Java 命令行无法找到或加载主类

android - 具有Room错误处理的RxJava2-数据库主线程异常

android - 如何更改我的 Android 设备上的 MAC 地址?

java - 如何在 Android 的同一 Activity 中将日期从一个 fragment 传递到另一个 fragment ?

java - 如何让我的服务器信任证书?