5

フラグメントクラスがあります。これが以下です:

public class FragmentA extends Fragment {

Button button;
WebView myWebView;
int mCurCheckPosition;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

 }

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

 @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
{
     View mainView = (View) inflater.inflate(R.layout.frag_a, group, false);
     myWebView = (WebView) mainView.findViewById(R.id.webview);
    myWebView.setWebViewClient(new MyWebViewClient());
    myWebView.getSettings().setPluginsEnabled(true);
    myWebView.getSettings().setBuiltInZoomControls(false); 
    myWebView.getSettings().setSupportZoom(false);
    myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
    myWebView.getSettings().setAllowFileAccess(true); 
    myWebView.getSettings().setDomStorageEnabled(true);
    myWebView.loadUrl("http://www.bbc.co.uk");       
    return mainView;
}


public class MyWebViewClient extends WebViewClient {        
    /* (non-Java doc)
     * @see android.webkit.WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
     */


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".mp4")) 
        {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "video/*");

            view.getContext().startActivity(intent);
            return true;
        } 
        else {
            return super.shouldOverrideUrlLoading(view, url);
        }
    }

}

}

問題は、別のフラグメントに移動したり、別のフラグメントから移動したりすると、元のフラグメントの状態(元のWebページ)が失われることです。

どうすればこれを防ぐことができますか?Webページの状態を各フラグメントとの間で切り替えたままにしておきたい。

ありがとう

4

2 に答える 2

5

onSaveInstanceState(Bundle outState)メソッドでWebView.saveState(Bundle state)メソッドを使用してから、onActivityCreated(Bundle savedInstanceState)メソッドでWebView.restoreState(Bundle state)を使用して状態を復元する必要があります

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   mWebView.saveState(outState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   mWebView.restoreState(savedInstanceState);
}

また、フラグメントのライフサイクルにも注意してください。状態を復元する場所(onCreate、onCreateView、onActivityCreated)がわからない場合は、フラグメントライフサイクルのドキュメントを参照して、適切な場所を見つけてください。 http://developer.android.com/guide/components/fragments.html

ここに画像の説明を入力してください

onCreate()

フラグメントを作成するときに、システムはこれを呼び出します。実装内で、フラグメントが一時停止または停止されてから再開されたときに保持するフラグメントの重要なコンポーネントを初期化する必要があります。

onCreateView()

フラグメントが初めてユーザーインターフェイスを描画するときに、システムはこれを呼び出します。フラグメントのUIを描画するには、フラグメントのレイアウトのルートであるこのメソッドからビューを返す必要があります。フラグメントがUIを提供しない場合は、nullを返すことができます。

onActivityCreated()

フラグメントのアクティビティが作成され、このフラグメントのビュー階層がインスタンス化されたときに呼び出されます。ビューの取得や状態の復元など、これらの要素が配置されたら、最終的な初期化を行うために使用できます。setRetainInstance(boolean)を使用するフラグメントがインスタンスを保持する場合にも役立ちます。これは、このコールバックがフラグメントに、新しいアクティビティインスタンスに完全に関連付けられたときに通知するためです。これは、onCreateView(LayoutInflater、ViewGroup、Bundle)の後、onStart()の前に呼び出されます。

于 2012-08-03T17:43:47.513 に答える
0

フラグメント内のwebViewコンテンツでも同じ問題が発生していました。私にとってうまくいったのは、新しいフラグメントをロードするときに、現在のフラグメントを置き換えるのではなく非表示にすることでした。これにより、ビューは前のフラグメントに残り、破棄されません。以下のコードを表示します。

protected void showTableFragment(フラグメントフラグメント、ブール値allowBack、アセットテーブル){

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (table != null)
        tableSection = (SectionTable) table;


        Fragment lastFragment = fragmentManager.findFragmentByTag("first_frag" );
        if ( lastFragment != null ) {
            transaction.hide( lastFragment );
        }


    if ( fragment.isAdded() ) {
        transaction.show( fragment );
    }
    else {
        transaction.add( R.id.fragment, fragment, "second_frag" ).setBreadCrumbShortTitle( "second_frag" );
    }

    if ( allowBack ) {
        transaction.addToBackStack( "second_frag" );
    }

    transaction.commit();
}
于 2013-10-09T11:57:59.537 に答える