0

我希望從另一個活動(RemoveStatement)訪問活動方法(Budgeting.readFromDb())。 RemoveStatement貫穿了BudgetingFragment(預算內的佔位符片段)的意圖。但是,當我嘗試獲取BudgetingFragment的一個實例(通過getFragmentManager()。findFragmentByTag(「budgetingFragment」))來調用getActivity()時,它返回一個空對象。我似乎無法弄清楚爲什麼這樣做以及如何解決這個問題。內budgetingFragment更換片段後Android:從另一個Activity獲取碎片活動實例

  1. 添加標籤堆棧中
  2. 呼叫getSupportFragmentManager()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。所以你的第二個活動找不到任何"budgetingFragment"

+0

那麼獲得片段實例甚至預算活動實例的最佳方法是什麼?建議將預算活動片段管理器的實例傳遞給RemoveStatement – JoeScott1232

+0

片段不應該意識到彼此(鬆耦合)。在主機Activity中爲參數設置片段並使用[callbacks](http://developer.android.com/training/basics/fragments/communicating.html) –

0

據我所見,您的意圖是將activity1的選定片段檢索到activity2,是否正確?

那麼,你會不會通過活性2的片段經理看,因爲它是在活性1的不同方面得到它。

的推薦方法是附聚從所選擇的片段所需的所有數據,並在意圖的定義(link1link2)將其傳遞給活性2

當創建活性2,你可以得到的數據,以前序列,因此使用它活性2。此外,您可以使用活動1link)中的替換交易向活動2充值新片段。請注意,要這樣做,您需要R.id.budgetingFragment FrameLayout ID在activity2的佈局上可用。

+0

我的目的是爲了獲得對預算類對象的引用,所以我可以使用它的方法readFromDb。我原本以爲最簡單的方法是通過調用Budgeting中的片段getActivity(),因爲該片段調用RemoveStatement類。我實際上並不關心片段存儲的數據,但它的getActivity()方法。 我現在認爲我可能更容易按照您的建議通過意圖將此引用傳遞給預算類。但是,是否有可能將BudgetingFragment.getActivity()作爲參數傳遞給intent? – JoeScott1232

+0

如果您創建一個* activityDB *,由DB實例化和方法組成,它將用於擴展* activity1 *和* activity2 *? 使用此功能,您可以在活動1和2中訪問所需的方法 - readFromDb()。 – ReVs

+0

我完全忽略了該解決方案。非常感謝你。我認爲數據庫之間不共享活動,但我設法分享使用SQLite開放助手單身人士。 – JoeScott1232