2012-12-12 15 views
10

私のアプリはLinerLayoutの中にwebviewといくつかのボタンを持っています。オリエンテーション変更のレイアウトを置き換えます

問題は、webviewが状態を維持している間、ボタンをポートレートモードでは下に、横向きモードでは左にします。

2つの異なるレイアウトは、Webビューをリフレッシュするアクティビティの再作成を強制するため、機能しません。今のところ私はandroid:configChanges = "orientation"をアクティビティタグに使用していますので、向きが変わったときにwebviewがリフレッシュされません。

画面モードの変更時にボタンのレイアウトを置き換えることはありますか?

enter image description here

ランドスケープモード

答えて

9

私はフラグメントをテストしましたが、フラグメントを扱うとはるかに複雑になり、フラグメント自体が保存と復元を必要とします。これはjavascript状態のwebviewでは機能しない可能性があります。記事のどこかに変更を加えて私が提案した解決策になった:

まず、android:configChanges="orientation|screenSize|keyboard|keyboardHidden"を追加して、アプリケーションがアンドロイドの代わりに設定変更を処理するようにします。

ランドスケープとポートレートの2種類のレイアウトを作成します。 webviewの代わりに両方のレイアウトで、Webviewのプレースホルダとして機能するFrameLayoutを配置します。

は、このような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

:WebViewのは、古いプレースホルダーから削除され、新しいレイアウトに戻ってそれを追加しますどの inituiと呼ばれる onConfigChange

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

oncreate()initui()とすると、最初にuiが初期化されます。

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    initUI() 
} 

私はそれが誰かにとって参考になりたいと思っています。それはようです。..リソースの下のフォルダとこの設定のために必要なレイアウトに言及 -

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.activity_splash); 
    } 
5

enter image description here

ポートレートモードではレイアウトのlayout-landであなたは風景として望むことを置きます。

configChange="orientation"は、その欠点があるため実際には使用しないでください。あなたは詳細な投稿hereを見つけることができます。レイアウトを変更する場合は、手動で状態を処理する必要があります。もちろん、これをプログラマチックに行うことはできますが、xmlを使用してこれを行う場合は、あなたは断片でWebViewを維持することができます。

+1

私は言った、それは動作しません。ビューを再作成し、Webビューをリフレッシュします。 android:configChanges = "orientation"この動作を防止します。 – Ali

+1

私はフラグメントについて読んだけど、実際にどのように動作するのか分かりません!それはアンドロイド2.2で動作しますか? – Ali

+0

サポートv4ライブラリを使用しています。実際の多くのアプリケーションでは、フラグメントが使用されます。それについて学ぶべきときまであなたに任せます。他の解決策はあなたを助け、断片を必要としません。しかし、フラグメントについて学びたい場合は、NewProject> MasterDetailedFlowまたはViewpagerテンプレートでテンプレートを見ることができます。 – wtsang02

1

ビューを相対的なレイアウトにします。方向が変更された場合、コード内の各ビューのレイアウトパラメータを調整するだけです。 風景

肖像

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 
buttonLinearLayout.setLayoutParams(lp); 


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.ABOVE, R.id.buttons); 
webView.setLayoutParams(webParams); 

...あなたのボタンが線形レイアウトと同様に

に含まれていることが持っている

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
buttonLinearLayout.setOrientation(LinearLayout.VERTICAL); 
buttonLinearLayout.setLayoutParams(lp); 


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons); 
webView.setLayoutParams(webParams); 

使用しているLayoutParamsがあることを確認してくださいRelativeLayout params(常にLayoutparamsを使用します。

-1

あなたが値 - 追加することができます(例えば、土地、肖像設定あなたが必要となります。):

4

については、以下のリンクをチェックアウトしてください、あなたがマニフェストにandroid:configChanges="orientation|screenSize"

を使用している場合、それは「レイアウトランド」でXMLを無視します。ランドスケープのために別のXMLを作成する場合は、マニフェスト内のそのアクティビティにandroid:configChanges="orientation|screenSize"タグを使用しないでください。

関連する問題