【问题标题】:Android IllegalArgumentException being calledAndroid IllegalArgumentException 被调用
【发布时间】:2017-06-12 17:35:28
【问题描述】:

我有一个应用,其导航栏包含多个片段。

查看 google play 控制台,查看崩溃。我看到一堆java.lang.IllegalArgumentExcpetion

我似乎无法复制这些问题,并且在日志中没有任何内容指向我的代码。

谁能解释可能是什么问题?

大多数错误看起来像这样,而有些错误的行号不同。

java.lang.IllegalArgumentException: 
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1293)
  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
  at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
  at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
  at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:158)
  at android.app.ActivityThread.main(ActivityThread.java:7225)
  at java.lang.reflect.Method.invoke(Native Method:0)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

编辑: 下面是MainActivity onNavigationItemSelected函数:

switch (id) {

    case R.id.dashboard:
        if (currentFragment instanceof DashboardFragment) break;
        // SET DASHBOARD FRAGMENT
        DashboardFragment fragment = new DashboardFragment();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
        break;
    case R.id.new_trans:

        // CLEAR
        staticTransaction.reset();
        staticCart.reset();

        if (currentFragment instanceof newTransFragment) break;
        // SET NEW TRANS FRAGMENT
        newTransFragment newTransFragment = new newTransFragment();
        fragmentTransaction.replace(R.id.fragment_container, newTransFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        break;
    case R.id.trans_history:
        if (currentFragment instanceof transHistoryFragment) break;
        // SET TRANS HISTORY FRAGMENT
        transHistoryFragment transHistoryFragment = new transHistoryFragment();
        fragmentTransaction.replace(R.id.fragment_container, transHistoryFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        break;
    case R.id.orders:
        if (currentFragment instanceof OrdersFragment) break;
        // SET ORDERS FRAGMENT
        OrdersFragment ordersFragment = new OrdersFragment();
        fragmentTransaction.replace(R.id.fragment_container, ordersFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        break;
    case R.id.pos:

        // CLEAR
        staticTransaction.reset();
        staticCart.reset();

        if (currentFragment instanceof POSFragment) break;
        // SET POS FRAGMENT
        POSFragment posFragment = new POSFragment();
        fragmentTransaction.replace(R.id.fragment_container, posFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        break;
    case R.id.products_list:
        if (currentFragment instanceof ProductsFragment) break;
        // SET PRODUCTS FRAGMENT
        ProductsFragment productsFragment = new ProductsFragment();
        fragmentTransaction.replace(R.id.fragment_container, productsFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        break;
    case R.id.customers_list:
        if (currentFragment instanceof CustomersFragment) break;
        // SET CUSTOMERS FRAGMENT
        CustomersFragment customersFragment = new CustomersFragment();
        fragmentTransaction.replace(R.id.fragment_container, customersFragment);
        fragmentTransaction.commit();
        break;
    case R.id.account_settings:
        if (currentFragment instanceof accountSettingsFragment) break;
        // SET ACCOUNT SETTINGS FRAGMENT
        accountSettingsFragment accountSettingsFragment = new accountSettingsFragment();
        fragmentTransaction.replace(R.id.fragment_container, accountSettingsFragment);
        fragmentTransaction.commit();
        break;
    case R.id.settings:
        if (currentFragment instanceof settingsFragment) break;
        // SET SETTINGS FRAGMENT
        settingsFragment settingsFragment = new settingsFragment();
        fragmentTransaction.replace(R.id.fragment_container, settingsFragment);
        fragmentTransaction.commit();
        break;
    case R.id.test_connection:
        if (currentFragment instanceof testConnectionFragment) break;
        // SET TEST CONNECTION FRAGMENT
        testConnectionFragment testConnectionFragment = new testConnectionFragment();
        fragmentTransaction.replace(R.id.fragment_container, testConnectionFragment);
        fragmentTransaction.commit();
        break;
    case R.id.sync:
        if (currentFragment instanceof SyncFragment) break;
        SyncFragment syncFragment = new SyncFragment();
        fragmentTransaction.replace(R.id.fragment_container, syncFragment);
        fragmentTransaction.commit();
        break;

}

当我在一个片段中并想转到另一个片段时,这是我用来执行此操作的代码:

// GOTO POS
POSFragment posFragment = new POSFragment();
getFragmentManager().beginTransaction().replace(R.id.fragment_container, posFragment).addToBackStack(null).commit();

当在一个活动中时,这里是代码:

// GOTO ACCOUNT SETTINGS
accountSettingsFragment fragment = new accountSettingsFragment();
FragmentTransaction fragmentTransaction = CustomerViewActivity.this.getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
Bundle bundle = new Bundle();
bundle.putInt("timedOut", 1);
fragment.setArguments(bundle);
fragmentTransaction.commit();

【问题讨论】:

  • 请将代码粘贴到你替换片段的地方
  • @fn5341 我编辑显示我的主要活动,还有其他地方替换片段,例如当我在新的事务片段中时,我可以转到 pos 片段
  • 看看这个question
  • 你有其他活动的碎片吗?

标签: java android


【解决方案1】:

发生的事情是您从不同的活动中调用片段

你正在尝试:Activity2 -> accountSettingsFragment 它实际上看不到。

你需要做的是转到拥有accountSettingsFragment的mainActivity

Intent i = new Intent(currentActivity.this,MainActivity.class);
startActivity(i);

【讨论】:

    【解决方案2】:

    我已经解决了这个问题,正如@OmerHayat 在我的问题中回答的那样。访问此链接Here

    也将其放入 Try catch 块中

    accountSettingsFragment fragment = new accountSettingsFragment();
    FragmentTransaction fragmentTransaction = CustomerViewActivity.this.getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment);
    Bundle bundle = new Bundle();
    bundle.putInt("timedOut", 1);
    fragment.setArguments(bundle);
    fragmentTransaction.commit();
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2023-03-24
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多