Вылетает исключение fragment already active

242
03 июня 2017, 15:00

Вылетает исключение в методе setArguments(Bundle). Я читал другие ответы на этот вопрос. Там говорили о удалении текущего фрагмента перед тем как начать работу с новым, но я так и не понял как это сделать в моем случае. Заранее благодарю за помощь. Код MainActivity:

public class MainActivity extends AppCompatActivity implements FragmentEventListener {

    FragmentTransaction transaction = null;
    ArrayList<Translate> translates = new ArrayList<Translate>();
    TranslatorFragment translatorFragment = TranslatorFragment.newInstance();
    HistoryFragment historyFragment = HistoryFragment.newInstance();
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_translator:
                        transaction = getSupportFragmentManager().beginTransaction();
                        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                        transaction.replace(R.id.constraintLayoutMain, translatorFragment);
                        transaction.commit();
                        return true;
                case R.id.navigation_history:
                        Bundle bundle = new Bundle();
                        bundle.putParcelableArrayList("translations", translates);
                        historyFragment.setArguments(bundle);
                        transaction = getSupportFragmentManager().beginTransaction();
                        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                        transaction.replace(R.id.constraintLayoutMain, historyFragment);
                        transaction.commit();
                        return true;
            }
            return false;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        transaction = getSupportFragmentManager().beginTransaction();
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        transaction.replace(R.id.constraintLayoutMain, TranslatorFragment.newInstance());
        transaction.commit();

        getSupportActionBar().setDisplayShowCustomEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.action_bar_layout, null);
        getSupportActionBar().setCustomView(v);
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#696969")));
        translates.size();
    }
    @Override
    public void setArrayListHistory(ArrayList<Translate> translates) {
        for (int i = 0; i < translates.size(); i++) {
            this.translates.add(0, translates.get(i));
        }
    }
}
Answer 1

Если посмотреть исходный код метода setArguments() (Ctrl + click), то там мы увидим описание, что данный метод должен быть вызван до того, как фрагмент будет приаттачен к активити. У вас он вызывается уже после.

Вы можете изменить ваш код следующим образом: добавьте в ваш метод HistoryFragment.newInstance() следующий код (нужно, чтобы на следующем шаге не получить NPE при обращении к аргументам):

setArguments(new Bundle()); 

И теперь вместо historyFragment.setArguments(bundle); делайте

historyFragment.getArguments().putParcelableArrayList("translations", translates);
READ ALSO
Перевод foreach с С# на Java

Перевод foreach с С# на Java

Как можно foreach (List<Tuple<int, int>> c in coords) переписать на Java?

277
hibernate mapping класса без идентификатора

hibernate mapping класса без идентификатора

есть класс Participant, они могут иметь идентификаторы в бд и маппятся как обычно А есть два класса Employyes и Students, они внутри имеют только Set из Participant'ов

262
Подключение script

Подключение script

Подскажите как подключить код, так что бы его видели все браузеры и ie9 и выше, но что бы его не видео ie8 и ниже?

337