【问题标题】:Fragment add or replace not working片段添加或替换不起作用
【发布时间】:2012-07-23 19:58:05
【问题描述】:

我正在使用来自 reference. 的代码

当我在我的程序中输入该代码时,出现如下图所示的错误。

错误的任何原因? 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
  • 更新了我的问题以显示 ExampleFragments.java
  • 你为什么用ExampleFragments fragment = new ExampleFragments();而不是Fragment fragment = new Fragment()
  • 我从developer.android.com/guide/components/fragments.htmlYou can then add a fragment using the add() method, specifying the fragment to add and the view in which to insert it. For example:复制粘贴
  • 澄清一下,为了消除错误,您必须使 Android 的示例 FragmentLayout.java 代码的“DetailsActivity”扩展“FragmentActivity”而不是“Activity”,然后 Eric 的解决方案将起作用。

标签: java android android-fragments


【解决方案1】:

这里的问题是你混合了android.support.v4.app.Fragmentandroid.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 是不可互换的。它们达到相同的目的,但在代码中不能相互替换。

【讨论】:

  • getSupportFragmentManager() 上出现错误 方法 getSupportFragmentManager() 未为 MainActivity 类型定义。我正在更新我的问题以显示导入。
  • 你的activity需要扩展FragmentActivity,而不是Activity。
  • @Sam_D - 打败我。 EGHDK - here 有一个解释。
  • 那么,如果活动完全处理片段,它“必须”扩展片段活动?
  • 是的,FragmentActivity 的某种形式。有扩展类,例如ListFragmentActivitySherlockFragmentActivity(如果使用ActionBarSherlock),但是是的,所有处理FragmentsActivitys 都必须扩展某种形式的FragmentActivity
【解决方案2】:

虽然这个问题可能已经得到解答,但应该注意的是,重叠片段的解决方案是使用新的“片段”实例获取片段 ID(实际上,在您的 xml 中声明的 FrameLayout id 会导致头疼):

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

我无法告诉你我花了多少小时在一个又一个帖子中没有解决方案。我阅读了您在上面 cmets 中链接的另一篇文章,我也会在那里回答,以防万一有人先发现。

对于那些获得ClassCastException 的人,也可以试试这个。您可以添加所有正确的库,使用FragmentActivity 而不是Fragment,并在代码中使用 getActivity().getSupportFragmentManager 来阻止 ListFragment 中的错误,但您仍然会遇到片段问题。 Google 文档不会向您展示所有内容,并且 Eclipse 代码完成不会总是为您提供帮助...有时您只需要自己修复错误!

【讨论】:

  • "(实际上在你的xml中声明的FrameLayout id会导致头疼)"救了我
【解决方案3】:

无论我尝试了什么(包括这里写的),在我看到这个答案之前我都无法解决这个问题

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

【讨论】:

    【解决方案4】:

    这对我有用

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

    【讨论】:

      【解决方案5】:

      试试看

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 2023-04-04
        相关资源
        最近更新 更多