1

目前正在尝试使用捆绑包将信息从我的 IncomeFragment 和 ExpenseFragment 传输到 HomeFragment,但我不确定如何去做。我试过实现他提供的 doubleA 的代码。

这是我的 MainActivity 中的 onAcceptClicked 方法,它从相关片段中获取总收入/支出的值并将其传输到 HomeFragment:

public void onAcceptClicked(String fragment, String total) {

    final FragmentManager fm = getFragmentManager();
    final FragmentTransaction ft = fm.beginTransaction();
    if (fragment == "income") {
        HomeFragment homeFrag = new HomeFragment();
        Bundle incomeBundle = new Bundle();
        incomeBundle.putString(IncomeFragment.TAG, total);
        //homeFrag.newInstance(total);
        ft.replace(R.id.content_layout, homeFrag, HomeFragment.TAG);
        ft.commit();
    }
    else if (fragment == "expense"){
        HomeFragment homeFragment = new HomeFragment();
        Bundle expenseBundle = new Bundle();
        expenseBundle.putString("bundleIncome", total);
        homeFragment.setArguments(expenseBundle);
        ft.replace(R.id.content_layout, homeFragment, HomeFragment.TAG);
        ft.commit();
    }
}

我的 IncomeFragment 中有一个接口,用于与 MainActivity 通信,因此我可以使用 onAcceptClicked 方法来传输我的总数。我计划用我的 ExpenseFragment 基本上做同样的事情。下面的代码是来自我的 IncomeFragment 的片段:

public interface SendIncomeData {
    public void onAcceptClicked(String fragment, String total);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_accept:
            //Toast.makeText(getActivity(), stringIncomeTotal, Toast.LENGTH_LONG).show();
            sendIncomeData.onAcceptClicked("income", stringIncomeTotal);
            return true;
        default:
            return super.onOptionsItemSelected(item);

    }
}

不幸的是,我在这行代码中遇到了错误

sendIncomeData.onAcceptClicked("income", stringIncomeTotal);

这是错误

java.lang.NullPointerException: Attempt to invoke interface method 'void mos.myapplication.IncomeFragment$SendIncomeData.onAcceptClicked(java.lang.String, java.lang.String)' on a null object reference

我不知道为什么它说有一个空对象引用和/或我如何解决这个错误。

我猜想在我的 HomeFragment 中显示我的总数可能会出错,因为我没有在 MainActivity 或 IncomeFragment / ExpenseFragment 的代码中的任何地方调用下面的方法。我没有使用它的原因是因为我不确定如何获取它,以便在启动应用程序时首先打开 HomeFragment。

    static HomeFragment newInstance(String total) 
{
    HomeFragment frag = new HomeFragment();
    Bundle args = new Bundle();
    args.putString(TAG, total);
    frag.setArguments(args);
    return frag;
}

我什至不介意从头开始,只要我可以转移总计并从 IncomeFragment > HomeFragment 和 ExpenseFragment > HomeFragment 显示它们

4

2 回答 2

0

很多人会争辩说,使用接口是最好的方法,这并没有错,但还有更简单的方法。编辑:不一定更简单 -一种方法是通过调用来获取对片段中活动的引用

this.getActivity();

然后在您的活动类中,您可以有一个将数据传递给另一个片段的方法,因为它引用了两个片段。

- 那么实际上有一种更好的方法(尽管第一部分可能也有帮助):

在有需要移动的数据的片段中,您可以从 FragmentManager 获取对另一个片段的引用。这假设您使用字符串 ID 创建了该片段,如下所示:

Fragment otherFragment;
getSupportFragmentManager().beginTransaction().add(otherFragment, "otherFrag").commit();

然后在包含数据的片段中,您将执行以下操作:

FragmentActivity fragmentActivity = (FragmentActivity)getActivity();
    OtherFragment otherFragment = (OtherFragment)fragmentActivity.getSupportFragmentManager().findFragmentByTag("otherFrag");

然后参考 OtherFragment (在这种情况下),您可以执行以下操作:

otherFragment.dataString = "myData";

但是您可能需要进行测试以确保其他片段不会返回 null,如果它为 null,您可能只想在当时和那里创建它,因为您已经拥有对 FragmentManager 的引用。

编辑:我只想说我主观上更喜欢这种方法。

于 2014-09-04T20:32:30.490 回答
0

您首先需要检查 bundle 是否为空:

bundle = this.getArguments();

if (bundle != null)
{
    // continue with your logic
}

此外,所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。有关更多信息,请参见以下链接:

于 2014-08-26T23:17:52.900 回答