2013-01-31 42 views
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(); 
    } 
} 


    } 

的錯誤是:

不能從片段投射到DetailFragment

的方法Add(INT,片段,字符串)在類型FragmentTransaction 不適用於參數(int,ListFragment,String)

的方法代替(INT,片段,字符串)在 型FragmentTransaction不適用的參數(INT, DetailFragment,字符串)

我怎樣才能解決這個問題呢?謝謝。

回答

7

您可能在混合compatibility Fragments和正常的3.0+ Fragment類。

如果你想使用的兼容包:

AndroidFragmentActivity延長FragmentActivity

變化

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

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

,並確保getFragmentManager()所有呼叫都代替getSupportFragmentManager()

確保您的碎片android.support.v4.app.Fragment延長,而不是android.app.Fragment

OR

如果你想使用正常的片段,破除一切support.v4進口,並確保你的碎片一起工作android.app.Fragment,這是不兼容的片段。

+0

感謝快速回復。你的意思是,我應該導入support.v4.app或導入support.app supportFragmentManager()和添加()等不是都tehm?這是真的? –

+1

@NiceNICE'supportFragmentManager()'和'add()'是您已經導入的'android.support.v4.app.FragmentTransaction' * class *的一部分*方法。只需確保您現在調用'getSupportFragmentManager()'而不是'getFragmentManager()'。 'add()'方法是相同的,如果你在Eclipse中按'ctrl + shift + O'來修復導入,請確保你擴展了'FragmentActivity'。 –

+0

getSupportFragmentManger()適用於Android 3+。這是真的?如果我在manifest文件中聲明minsdkVersion = 9,如果程序在android 2.3的設備上運行,會發生什麼? (我導入android.support.v4.app不android.app)。 –

0

看起來你正在將支持庫(v4)片段與原生片段混合在一起。確保所有碎片和相關組件都使用v4。例如,您的活動應擴展爲FragmentActivity而不是Activity。確保您的ListFragmentDetailFragment也使用v4而不是本機碎片。

+0

感謝您的回答。請在評論中回答另一個問題。謝謝 –

0

我們應該確定我們是否使用兼容性或正常的片段,無論是android.support.v4.app。*還是android.app。*

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

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

,它很適合我。