Фрагмент добавить или заменить не работает

Я использую код из этого справочника.

Когда я вставляю этот код в свою программу, я получаю сообщение об ошибке, как показано на рисунке ниже. введите здесь описание изображения

Есть причины ошибки? The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, ExampleFragments)

Код из моей основной деятельности:

public void red(View view) {
        android.app.FragmentManager fragmentManager = getFragmentManager();
                android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ExampleFragments fragment = new ExampleFragments();
        fragmentTransaction.replace(R.id.frag, fragment);
        fragmentTransaction.commit();
    }

ExampleFragments.java

package com.example.learn.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ExampleFragments extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.blue_pill_frag, container, false);
    }
}

Здесь:

package com.example.learn.fragments;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;

person EGHDK    schedule 23.07.2012    source источник
comment
Можешь показать свой ExampleFragments класс? Я подозреваю, что это не расширяет Fragment.   -  person Eric    schedule 24.07.2012
comment
Обновлены мои вопросы, чтобы показать ExampleFragments.java   -  person EGHDK    schedule 24.07.2012
comment
Почему вы используете ExampleFragments fragment = new ExampleFragments();, а не Fragment fragment = new Fragment()?   -  person mattdonders    schedule 24.07.2012
comment
просто чтобы уточнить, чтобы избавиться от ошибок, вы должны сделать DetailsActivity кода FragmentLayout.java для Android, расширяющего FragmentActivity, а не Activity, тогда решение Эрика будет работать.   -  person whyoz    schedule 25.04.2013
comment
Вам нужно проверить импорт. импортировать версию Fragment, которая необходима в методе replace(). Я также столкнулся с тем же в Android Studio, и теперь он решен.   -  person Rahul Raina    schedule 13.01.2016


Ответы (5)


Проблема здесь в том, что вы смешиваете android.support.v4.app.Fragment и android.app.Fragment. Вам нужно преобразовать все виды использования для использования библиотеки поддержки, что также означает вызов getSupportFragmentManager().

Что-то вроде этого, например:

    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    ExampleFragments fragment = new ExampleFragments();
    fragmentTransaction.replace(R.id.frag, fragment);
    fragmentTransaction.commit();

Важно отметить, что вспомогательная библиотека Fragment и обычная Fragment НЕ взаимозаменяемы. Они служат той же цели, но не могут быть заменены друг другом в коде.

person Eric    schedule 23.07.2012
comment
Получение ошибки getSupportFragmentManager() Метод getSupportFragmentManager() не определен для типа MainActivity. Я обновляю свой вопрос, чтобы показать импорт. - person EGHDK; 24.07.2012
comment
Ваша активность должна расширять FragmentActivity, а не Activity. - person Sam Dozor; 24.07.2012
comment
@Sam_D - Опереди меня. EGHDK - здесь есть объяснение . - person Eric; 24.07.2012
comment
Итак, если активность вообще имеет дело с фрагментами, она должна расширять активность фрагментов? - person EGHDK; 24.07.2012
comment
Да, какая-то форма FragmentActivity. Существуют расширенные классы, такие как ListFragmentActivity или SherlockFragmentActivity (при использовании ActionBarSherlock), но да, все Activity, обрабатывающие Fragments, должны расширять некоторую форму FragmentActivity. - person Eric; 24.07.2012
comment
Потрясающий. Очень проницательно. У меня есть последний вопрос, потому что код работает, но добавляет макет, а не заменяет его. ИЕ: Старая раскладка во фрагменте осталась. Должен ли replace позаботиться об этом? - person EGHDK; 24.07.2012
comment
Да, должно было. Тем не менее, я бы предложил пометить решение для этого вопроса и задать для этого новый вопрос, поскольку совместное использование кода в потоках комментариев становится довольно громоздким. Вы также можете найти решение в других темах Fragment или .replace(). - person Eric; 24.07.2012
comment
Спасибо. Я начну с другого вопроса, потому что чувствую, что неправильно решаю свою проблему. Спасибо - person EGHDK; 24.07.2012
comment
Вот мой новый вопрос. Заранее спасибо: stackoverflow.com/questions/11620855/ - person EGHDK; 24.07.2012
comment
давайте продолжим это обсуждение в чате - person EGHDK; 24.07.2012
comment
Убедитесь, что класс ExampleFragments также импортирует android.support.v4.app.Fragment; а не android.support.app.Fragment; - person stackoverflow; 18.11.2013
comment
Эрик, помоги мне. У меня возникла странная проблема. - person Steve; 22.08.2014
comment
Спасибо, Эрик. Я неделю занимался этим вопросом. Это работает для меня. - person Sepaka; 17.03.2015
comment
Привет, первоначальная замена фрагмента работает, но при второй замене одного и того же фрагмента возникает ошибка нулевого указателя, пожалуйста, помогите мне заранее спасибо - person vijay; 11.01.2016

Хотя на этот вопрос, возможно, был дан ответ, следует отметить, что решение для перекрывающихся фрагментов состоит в том, чтобы получить идентификатор фрагмента (на самом деле идентификатор FrameLayout, поскольку объявление в вашем xml приведет к головным болям) со свежим экземпляром «Фрагмента»:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = new ExampleFragments();
fragmentTransaction.replace(R.id.frag, fragment);
fragmentTransaction.commit();

Я не могу сказать вам, сколько часов я провел, просматривая пост за постом без решения. Я прочитал ваш другой пост, на который есть ссылка в комментариях выше, и я также отвечу там на тот случай, если кто-то найдет это первым.

Для тех, кто получает ClassCastException, попробуйте и это. Вы можете добавить все нужные библиотеки, используя FragmentActivity вместо Fragment, и иметь getActivity().getSupportFragmentManager в своем коде, чтобы остановить ошибки в ListFragment, и вы все равно столкнетесь с проблемами с фрагментами. Документы Google не показывают вам все, и завершение кода Eclipse не всегда спасет вас ... иногда вам просто нужно исправить ошибку самостоятельно!

person whyoz    schedule 08.05.2013
comment
(на самом деле идентификатор FrameLayout, поскольку объявление в вашем xml приведет к головной боли) спас меня - person vinay; 20.12.2018

Что бы я ни пробовал (включая написанное здесь), я не мог решить эту проблему, пока не увидел этот ответ

https://stackoverflow.com/a/5907704/728312

person Alpaslan    schedule 08.05.2015

Это сработало для меня

android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();

person Mudasar    schedule 19.07.2017

Попробуйте

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
  fragmentTransaction.replace(R.id.frag, new ExampleFragments()).commit();
person Om Prakash Sharma    schedule 06.05.2019