Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: EGHDKОтветов: 5

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

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

Есть причины ошибки? 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;
  • Можешь показать свой ExampleFragments класс? Я подозреваю, что это не расширяет Fragment. Eric 24.07.2012
  • Обновлены мои вопросы, чтобы показать ExampleFragments.java EGHDK 24.07.2012
  • Почему вы используете ExampleFragments fragment = new ExampleFragments();, а не Fragment fragment = new Fragment()? mattdonders 24.07.2012
  • Я скопировал и вставил с developer.android.com/guide/components/fragments.html You can then add a fragment using the add() method, specifying the fragment to add and the view in which to insert it. For example: EGHDK 24.07.2012
  • просто чтобы уточнить, чтобы избавиться от ошибок, вы должны сделать DetailsActivity кода FragmentLayout.java для Android, расширяющего FragmentActivity, а не Activity, тогда решение Эрика будет работать. whyoz 25.04.2013
  • Вам нужно проверить импорт. импортировать версию Fragment, которая необходима в методе replace(). Я также столкнулся с тем же в Android Studio, и теперь он решен. Rahul Raina 13.01.2016

androidjavaandroid-fragments

Ответы

Ответ 1 · рейтинг 167 · Eric

Проблема здесь в том, что вы смешиваете 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 НЕ взаимозаменяемы. Они служат той же цели, но не могут быть заменены друг другом в коде.

Ответ 2 · рейтинг 7 · whyoz

Хотя на этот вопрос, возможно, был дан ответ, следует отметить, что решение для перекрывающихся фрагментов состоит в том, чтобы получить идентификатор фрагмента (на самом деле идентификатор 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 не всегда спасет вас ... иногда вам просто нужно исправить ошибку самостоятельно!

Ответ 3 · Alpaslan

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

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

Ответ 4 · Mudasar

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

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

Ответ 5 · Om Prakash Sharma

Попробуйте

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы