1

私のアプリには、縦向きと横向きの2つの異なるレイアウトがあり、どちらもWebビューといくつかのボタンをカプセル化しています。ボタンは縦向きの下部と横向きの左側にあるため、Webビューでより多くの読書スペースを利用できます。

問題は、アクティビティが画面の回転時に再作成され、webviewが最初のページをロードすることです。これは望ましくない動作です。

アクティビティタグでandroid:configChanges = "orientation"を使用すると、アクティビティの再作成が妨げられることがわかりました。ただし、問題は、アクティビティの作成時に発生するレイアウトの変更も防止することです。

プログラムを2.2で動作させたいのですが、これを行うにはどうすればよいですか?

4

3 に答える 3

1

フラグメントをテストしましたが、フラグメントを扱うと物事がはるかに複雑になり、フラグメント自体を保存して復元する必要があり、javascript 状態の Web ビューでは機能しない可能性があります。私が提案する解決策:

最初に、android:configChanges="orientation|screenSize|keyboard|keyboardHidden" をマニフェストに追加して、アプリが Android の代わりに構成の変更を処理するようにします。

横向きと縦向きの 2 つの異なるレイアウトを作成し、対応するレイアウト フォルダに配置します。webview の代わりに両方のレイアウトで、webview のプレースホルダーとして機能する LinerLayout を配置します。

コードで initUI メソッドを次のように定義し、UI の初期化に関連するすべてのものをこのメソッドに入れます。

public void initui()
{
    setContentView(R.layout.main);
    if (wv == null) wv = new WebView(this);
    ((LinearLayout)findViewById(R.id.webviewplace)).addView(wv);
    findViewById(R.id.home).setOnClickListener(this);
}

webview が存在しない場合は作成され、setContentView(R.layout.main) の後にレイアウトに追加されます。その他の UI カスタマイズはその後でした。

および onConfigurationChanged で:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    ((LinearLayout)findViewById(R.id.webviewplace)).removeAllViews();
    super.onConfigurationChanged(newConfig);
    initUI();
}

onConfigChange 最初に webview が古いプレースホルダーから削除され、initui が呼び出されて新しいレイアウトに追加されます。

oncreate で initui を呼び出すと、UI が初めて初期化されます。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    initUI()
}
于 2012-12-18T18:32:03.833 に答える
0

最後に読み込まれた URL を webview に保存してonSaveInstanceState(Bundle outState)から、必ず をonRestoreInstanceState(Bundle savedInstanceState)使用して再読み込みできませんmyWebview.loadUrl(restoredUrl)か?

編集表示している Web ページで状態を維持する必要がある場合、これが機能しない可能性があることはわかっています。しかし、そうでない場合は、問題の解決策になるはずです。

于 2012-12-12T16:19:14.593 に答える