0

他のアクティビティ(RemoveStatement)からアクティビティメソッド(Budgeting.readFromDb())にアクセスしたいと思います。 RemoveStatementは、BudgetingFragment(Budgeting内のプレースホルダフラグメント)のインテントを通して実行されます。Android:別のアクティビティからフラグメントアクティビティのインスタンスを取得

しかし、getActivity()を呼び出すためにBudgetingFragment(getFragmentManager()、findFragmentByTag( "budgetingFragment")を介して)のインスタンスを取得しようとすると、nullオブジェクトが返されます。なぜこれをやっているのか、どうやって解決するのか分かりません。

私は、次のことを試してみました:

  1. はコールgetSupportFragmentManager(backStack
  2. をタグを追加)budgetingFragment内のフラグメントを交換した後executePendingTransactionsを()。。

これを解決するための助けがあれば幸いです。予算内

方法フラグメント

public void onClickFragment(int id, String arrowDirection){ 
    //Get current Fragment 
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.budgetingFragment); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 


    if (currentFragment instanceof BudgetingOverviewFragment && arrowDirection == "Left"){ 
     IncomeFragment incomeFragment = new IncomeFragment(); 
     transaction.replace(R.id.budgetingFragment, incomeFragment, "budgetingFragment"); 

    } 
    else if (currentFragment instanceof BudgetingOverviewFragment && arrowDirection == "Right"){ 
     ExpenseFragment expenseFragment = new ExpenseFragment(); 
     transaction.replace(R.id.budgetingFragment, expenseFragment, "budgetingFragment"); 
    } 
    else if (currentFragment instanceof IncomeFragment && arrowDirection == "Right"){ 
     BudgetingOverviewFragment overviewFragment = new BudgetingOverviewFragment(); 
     transaction.replace(R.id.budgetingFragment, overviewFragment, "budgetingFragment"); 
    } 
    else{ 
     BudgetingOverviewFragment overviewFragment = new BudgetingOverviewFragment(); 
     transaction.replace(R.id.budgetingFragment, overviewFragment, "budgetingFragment"); 
    } 

    transaction.addToBackStack("budgetingFragment"); 
    transaction.commit(); 
    getSupportFragmentManager().executePendingTransactions(); 

} 

RemoveStatementsのonCreate内のコード()メソッドを変更する:

FragmentManager fm = getFragmentManager(); 

    //This Fragment is a null pointer 
    Fragment callingFragment = fm.findFragmentByTag("budgetingFragment"); 

    //This crashes the application as getActivity() is called on a null reference 
    Budgeting budgeting = (Budgeting) callingFragment.getActivity(); 

答えて

0

すべてのアクティビティは、それがFragmentManagerを所有しています。したがって、2番目のアクティビティでは"budgetingFragment"は見つかりません。

+0

したがって、断片化されたインスタンスまたは予算作成アクティビティのインスタンスを取得する最良の方法は何ですか? Budgeting ActivitiesのフラグメントマネージャーのインスタンスをRemoveStatement – JoeScott1232

+0

に渡すことをお勧めしますか?フラグメントは互いに認識してはいけません(疎結合)。ホストアクティビティのフラグメントに引数を設定し、[callbacks](http://developer.android.com/training/basics/fragments/communicating.html) –

0

私の知る限り見ることができるように、あなたの意図は正しいactivity2、へactivity1の選択されたフラグメントを取得するのですか?

さて、あなたはそれがactivity1の異なる文脈上だからactivity2のフラグメントマネージャを見て、それを得ることはありません。

推奨される方法は、選択された断片から必要なすべてのデータを凝集し意図の定義(link1又はlink2)中activity2に渡すことです。

activity2が作成されると、あなたがデータを取得することができ、以前にシリアル化され、これactivity2にそれを使用しています。また、アクティビティ2に新しいフラグメントを追加して、アクティビティ1のように置き換えトランザクションを行うことができます。link)これを行うには、activity2のレイアウトでR.id.budgetingFragment FrameLayout IDを使用できるようにする必要があります。

+0

を使用します。私の意図は全体的に、Budgetingクラスオブジェクトへの参照を取得することですメソッドreadFromDbを使用できます。もともと、これを行う最も簡単な方法は、そのフラグメントがRemoveStatementクラスを呼び出すときに、Budgeting内のフラグメントに対してgetActivity()を呼び出すことだと考えました。実際にフラグメントが保存するデータに興味はありませんが、そのgetActivity()メソッドです。 私は、あなたが提案したように、この参照をBudgetingクラスに渡す方が簡単かもしれないと考えています。ただし、BudgetingFragment.getActivity()をインテントのパラメータとして渡すことは可能ですか? – JoeScott1232

+0

* activity1 *と* activity2 *を拡張するために使用されるDBインスタンス化とメソッドで構成された* activityDB *を作成するとどうなりますか? これで、アクティビティ1と2の両方で、目的のメソッドreadFromDb()にアクセスできます。 – ReVs

+0

私はその解決策を見落としました。どうもありがとうございました。私はデータベースが活動の間で共有されていないと思ったが、私はSQLiteオープンヘルパーシングルトンを使って共有することができた。 – JoeScott1232

関連する問題