私は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が単純フラグメントであるかのように見えるはずです。私が以前に言ったように、これは私の輸入品と関係がありますか?
ありがとうございました!
私はそれを恐れていました。私は彼らがすぐにAndroidサポートパッケージにWebViewFragmentを追加することを願っています。断片を使用しながら、すべてのプラットフォームで実行したいという人にとっては大きな穴です。 – JustLearningAgain
@ JustLearningAgain: 'WebViewFragment'は[約100行のコード]です(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/WebViewFragment.java)。それをあなたのプロジェクトにコピーし、自分のパッケージにリファクタリングし、 'fragment.'の' support.v4'版から継承するように変更します。私は1つのプロジェクト(まだリリースされていない、または私はあなたにそれを指摘したい)でこれを行い、これまではうまくいっています。 – CommonsWare
素晴らしいアイデア。ありがとう。 – JustLearningAgain