1

我是android编程的初学者。我想用片段编写一个程序,我阅读了本教程(http://www.mysamplecode.com/2012/08/android-fragment-example.html)并编写了它,但是当我运行程序时,程序有编译器错误!错误与 add() 和 replace() 函数有关。

我在下面写了 AndroidFragmentActivity 类,请阅读并帮助我。

AndoridFragmentActivity.java:

package com.appfragmentarray;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentActivity;
 import android.util.Log;

import com.appfragmentarray.ListFragment.OnURLSelectedListener;

public class AndroidFragmentActivity extends Activity implements OnURLSelectedListener{
     boolean detailPage = false;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.v("AndroidFragmentActivity", "onCreate()");
  Log.v("AndroidFragmentsavedInstanceState", savedInstanceState == null ? "true" : "false");

  setContentView(R.layout.activity_main);

  if(savedInstanceState == null) {
   android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
   ListFragment listFragment = new ListFragment();
   ft.add(R.id.displayList, listFragment, "List_Fragment");
   ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
   ft.commit();
  }

  if(findViewById(R.id.displayDetail) != null){
   detailPage = true;
   getFragmentManager().popBackStack();

   DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.displayDetail);
   if(detailFragment == null){
    android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
    detailFragment = new DetailFragment();
    ft.replace(R.id.displayDetail, detailFragment, "Detail_Fragment1");
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.commit();
   }
  }

 }


 public void onURLSelected(String URL) {
  Log.v("AndroidFragmentActivity",URL);

  if(detailPage){
   DetailFragment detailFragment = (DetailFragment)
   getFragmentManager().findFragmentById(R.id.displayDetail);
   detailFragment.updateURLContent(URL);
  }
  else{
   DetailFragment detailFragment = new DetailFragment();
   detailFragment.setURLContent(URL);
   android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
   ft.replace(R.id.displayList, detailFragment, "Detail_Fragment2");
   ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
   ft.addToBackStack(null);
   ft.commit();
  }
 }


  }

错误是:

无法从 Fragment 转换为 DetailFragment

FragmentTransaction 类型中的方法 add(int, Fragment, String) 不适用于参数 (int, ListFragment, String)

FragmentTransaction 类型中的方法 replace(int, Fragment, String) 不适用于参数 (int, DetailFragment, String)

我该如何解决这个问题?谢谢。

4

3 回答 3

7

您可能混淆了兼容性 Fragment和正常的 3.0+ Fragment类。

如果要使用兼容包:

使AndroidFragmentActivity扩展FragmentActivity

改变

android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

并确保所有调用getFragmentManager()都是getSupportFragmentManager()

确保您的 Fragments 扩展自android.support.v4.app.Fragment而不是android.app.Fragment

或者

如果你想使用普通的 Fragment,去掉所有的support.v4导入,并确保你的 Fragments 可以使用android.app.Fragment,这是 non-comptability Fragment。

于 2013-01-31T16:56:38.767 回答
0

看起来您正在将支持库 (v4) 片段与本机片段混合。确保您的所有片段和相关组件都使用 v4。例如,您的活动应该是扩展FragmentActivity而不是Activity. 确保您ListFragmentDetailFragment使用 v4 而不是原生 Fragments。

于 2013-01-31T17:00:21.820 回答
0

我们应该确定我们使用的是兼容性还是普通片段,无论是 android.support.v4.app.* 还是 android.app.*

我正在使用android.support.v4.app.*

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

它对我很有效..

于 2014-06-20T18:30:47.473 回答