2012-03-03 13 views
4

私はActionBarSherlockを使用しており、タブ付きアプリケーションを実装しています。各タブは、WebViewだけを含むフラグメントを表します。私はフラグメントから派生したオブジェクトを実装しました。しかし、WebViewFragmentに変更したら、もはやFragmentTransactionに追加することはできません。私は正しいものをインポートするかどうか疑問に思っていますか?ここでは、コードです:WebViewFragment派生クラスをFragmentTransactionに追加できません

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTransaction; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.webkit.WebViewFragment; 
import android.widget.TextView; 

public class WebTab1Fragment extends FragmentActivity { 
    int mStackLevel = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.webtab1_layout); 


    if (savedInstanceState == null) { 
     // Do first time initialization -- add initial fragment. 
     MyWebvewFragment newFragment = MyWebviewFragment.newInstance(mStackLevel); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.simple_fragment, newFragment).commit(); 

    } else { 
     mStackLevel = savedInstanceState.getInt("level"); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("level", mStackLevel); 
} 


void addFragmentToStack() { 
    mStackLevel++; 

    // Instantiate a new fragment. 
    MyWebviewFragment newFragment = MyWebviewFragment.newInstance(mStackLevel); 

    // Add the fragment to the activity, pushing this transaction 
    // on to the back stack. 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.simple_fragment, newFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 



public static class MyWebviewFragment extends WebViewFragment { 
    int mNum; 
    private WebView webview = null; 
    private ProgressDialog mSpinner = null; 
    private static final int DIALOG_PROGRESS = 1; 
    private Handler mProgressHandler; 
    boolean bFinishFlag = true; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     // TODO Auto-generated method stub 
     mProgressHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       super.handleMessage(msg); 
       if (bFinishFlag == true) 
        mSpinner.dismiss(); 
       else 
        mProgressHandler.sendEmptyMessageDelayed(0, 100); 
      } 
     }; 

     super.onActivityCreated(savedInstanceState); 
    } 

    /** 
    * Create a new instance of CountingFragment, providing "num" 
    * as an argument. 
    */ 
    static MyWebviewFragment newInstance(int num) { 
     MyWebviewFragment f = new MyWebviewFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

問題行は以下のとおりです。

ft.add(R.id.simple_fragment, newFragment).commit(); 

.... 

ft.replace(R.id.simple_fragment, newFragment); 

私は理由を理解することはできません。 MyWebviewFragmentは、Fragmentを拡張するWebViewFragmentを継承します。 FragmentTransactionメソッドは、MyWebviewFragmentが単純フラグメントであるかのように見えるはずです。私が以前に言ったように、これは私の輸入品と関係がありますか?

ありがとうございました!

答えて

15

MyWebviewFragmentは、Fragmentを拡張するWebViewFragmentを継承します。

あなたはAPIレベル11ネイティブの断片(android.app.Fragment)とAndroidのサポートパッケージの断片(android.support.v4.app.Fragment)を混在させることはできません。 android.webkit.WebViewFragmentを作成することはできません。android.webkit.WebViewFragmentがになり、android.support.v4.app.Fragmentではないため、android.support.v4.app.FragmentActivityと一緒に使用することはできません。

APIレベル11以上のアプリを作成してActionBarSherlockやAndroid Supportパッケージを使用しないでください。WebViewFragmentを使用しないでください(またはソースコードからコピーしてプロジェクトにリファクタリングしてください)。

+0

私はそれを恐れていました。私は彼らがすぐにAndroidサポートパッケージにWebViewFragmentを追加することを願っています。断片を使用しながら、すべてのプラットフォームで実行したいという人にとっては大きな穴です。 – JustLearningAgain

+8

@ JustLearningAgain: 'WebViewFragment'は[約100行のコード]です(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/WebViewFragment.java)。それをあなたのプロジェクトにコピーし、自分のパッケージにリファクタリングし、 'fragment.'の' support.v4'版から継承するように変更します。私は1つのプロジェクト(まだリリースされていない、または私はあなたにそれを指摘したい)でこれを行い、これまではうまくいっています。 – CommonsWare

+0

素晴らしいアイデア。ありがとう。 – JustLearningAgain

関連する問題