1

現在、バンドルを使用して、IncomeFragment と ExpenseFragment の両方から HomeFragment に情報を転送しようとしていますが、その方法がわかりません。彼が提供した doubleA のコードを実装してみました。

これは、関連するフラグメントから総収入/支出の値を取得し、それを HomeFragment に転送する MainActivity からの onAcceptClicked メソッドです。

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

null オブジェクト参照があると言っている理由や、このエラーを修正する方法がわかりません。

MainActivity または IncomeFragment / ExpenseFragment のコード内のどこにも以下のメソッドを呼び出していないため、HomeFragment に合計を表示する際にエラーが発生する可能性があると推測しています。私がそれを使用していない理由は、アプリケーションの起動時に 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

最初に bundle が null かどうかを確認する必要があります。

bundle = this.getArguments();

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

また、すべてのフラグメント間通信は、関連付けられたアクティビティを通じて行われます。2 つのフラグメントが直接通信することはありません。詳細については、以下のリンクを参照してください。

于 2014-08-26T23:17:52.900 に答える
0

インターフェイスを使用するのが最善の方法であると多くの人が主張しますが、これは間違いではありませんが、もっと簡単な方法があります。編集:必ずしも単純ではありません -1つの方法は、呼び出してフラグメント内のアクティビティへの参照を取得することです

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 に答える