Почему обсуждается в C ++ FAQ (boldfacing mine):
В C ++ ссылки, не относящиеся к const, могут связываться с lvalues и ссылки const могут связываться с lvalues или rvalues, но нет ничего, что могло бы связываться с неконстантным значением r. Это необходимо для защиты людей от изменения значений временных объектов, которые уничтожаются до того, как их новое значение может быть использовано. Например:
void incr(int& a) { ++a; } int i = 0; incr(i); // i becomes 1 incr(0); // error: 0 is not an lvalue
Если этот incr (0) был разрешен либо временным, что никто никогда не видел, будет увеличиваться или - намного хуже - значение 0 станет 1 . Последнее звучит глупо, но на ранних компиляторах Fortran на самом деле была ошибка, которая выделяла место памяти для хранения значения 0.
, пожалуйста, следуйте проверке счетчика перед заменой, если счет == 0, добавьте еще, ваш код замены должен быть похож на
public void loadFragment(Fragment fragment){
FragmentManager fragmentManager = Objects.requireNonNull(getActivity()).getSupportFragmentManager();
// Begin Fragment transaction.
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// Replace the layout holder with the required Fragment object.
if(fragmentManager.getFragments().size() == 0){
fragmentTransaction.add(R.id.outbound_dashboard_hourly_queued, fragment).commit();
}else {
fragmentTransaction.replace(R.id.outbound_dashboard_hourly_queued, fragment).commit();
}
// Commit the Fragment replace action.
}
, пожалуйста, попробуйте с этим и дайте мне знать.
попробуйте
Проверить, добавлен фрагмент или нет
if (getCurrentFragment() instanceof YourFragment)
Добавить фрагмент
replaceFragment(new HomeFragment(), "YourFragment");
[ 119] Методы
private void replaceFragment(Fragment fragment, String tag)
{
Fragment currentFragment = getCurrentFragment();
if (currentFragment != null)
getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
getSupportFragmentManager().beginTransaction().add(R.id.container_main, fragment, tag).commit();
}
public Fragment getCurrentFragment()
{
FragmentManager manager = getSupportFragmentManager();
return manager.findFragmentById(R.id.container_main);
}
private void popBackStack()
{
FragmentManager fragmentManager = getSupportFragmentManager();
int total = fragmentManager.getBackStackEntryCount();
for (int i = 0; i < total; i++)
{
fragmentManager.popBackStack();
}
}
просто сделайте findViewById(R.id.outbound_dashboard_hourly_queued)
и затем загрузите фрагмент, если представление не Null, сохраните проверку if.
public void loadFragment(Fragment fragment){
FragmentManager fragmentManager = Objects.requireNonNull(getActivity()).getSupportFragmentManager();
// Begin Fragment transaction.
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// Replace the layout holder with the required Fragment object.
View yourView= findViewById(R.id.outbound_dashboard_hourly_queued);
if(yourView!=null){
fragmentTransaction.replace(R.id.outbound_dashboard_hourly_queued, fragment);
// Commit the Fragment replace action.
fragmentTransaction.commit();
}
}
Вы можете использовать метод findFragmentByTag (тег String), предоставленный FragmentManager, чтобы проверить, существует ли фрагмент уже или нет.
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG);
Чтобы это работало, вам нужно зафиксировать свой фрагмент с этим TAG, используя -
fragmentTransaction.replace(R.id.outbound_dashboard_hourly_queued, fragment, TAG);