Android:从另一个活动

时间:2016-04-18 13:44:54

标签: android android-fragments android-intent android-activity

我希望从另一个活动(RemoveStatement)访问活动方法(Budgeting.readFromDb())。 RemoveStatement通过BudgetingFragment(Budgeting中的占位符片段)的意图运行。

但是,当我尝试获取BudgetingFragment的实例(通过getFragmentManager()。findFragmentByTag(“budgetingFragment”))来调用getActivity()时,它返回一个null对象。我似乎无法弄清楚它为什么这样做以及如何解决它。

我尝试了以下事项:

  1. 将标签添加到backStack
  2. 在budgetingFragment中替换片段后调用getSupportFragmentManager()。executePendingTransactions()。
  3. 任何帮助解决这个问题都将受到赞赏。

    预算内改变片段的方法

    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();
    

2 个答案:

答案 0 :(得分:0)

每个活动都有自己的FragmentManager。因此,您的第二项活动找不到任何"budgetingFragment"

答案 1 :(得分:0)

据我所知,您打算将 activity1 的所选片段检索到 activity2 中,对吗?

嗯,通过查看 activity2 的片段管理器,您无法获得它,因为它位于 activity1 的不同上下文中

推荐的方法是聚集所选片段中所需的所有数据,并在意图的定义(link1或<}期间将其传递给 activity2 link2)。

创建 activity2 时,您可以获取先前已序列化的数据,从而在 activity2 上使用它。此外,您可以使用替换事务在 activity2 上为新片段充气,如 activity1 link)。请注意,要执行此操作,您需要在{em> activity2 的布局中提供R.id.budgetingFragment FrameLayout ID。