15

私のアプリには、LinerLayout 内に webview といくつかのボタンがあります。

問題は、webview がその状態を維持している間、ボタンをポートレート モードでは下に、ランドスケープ モードでは左に配置することです。

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

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

ここに画像の説明を入力

ポートレートモード

ここに画像の説明を入力

横長モード

4

7 に答える 7

16

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

最初にandroid:configChanges="orientation|screenSize|keyboard|keyboardHidden"、アプリが Android ではなく構成の変更を処理するように追加します。

横向きと縦向きの 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

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

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

oncreate()呼び出しで、initui()UI が初めて初期化されます。

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

どなたかの参考になれば幸いです。

于 2012-12-18T17:07:04.420 に答える
6

layout-land横向きにしたいレイアウトにそれを入れてください。

アイデアは、configChange="orientation"マイナス面があるため、実際には使用しないでください。ここで詳細な投稿を見つけることができます。レイアウトを変更したい場合は、状態を手動で処理する必要があります。もちろん、プログラムでこれを行うこともできますが、xml を使用してこれを行う場合。フラグメントを使用して webView を維持できます。

于 2012-12-12T20:59:17.273 に答える
3

このコードを使用してみてください:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.activity_splash);
    }
于 2014-03-31T16:49:38.583 に答える
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 パラメーターであることを確認してください (常にビューの親の Layoutparams を使用してください)。

于 2012-12-12T21:12:47.780 に答える
0

マニフェストに追加

<activity android:name=".MyActivity"
      android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
      android:label="@string/app_name">

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (Resources.getSystem().getDisplayMetrics().widthPixels>
            Resources.getSystem().getDisplayMetrics().heightPixels)
    setContentView(R.layout.activity_layout1);
    else setContentView(R.layout.activity_layout2); 

...

}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    setContentView(R.layout.activity_layout1);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    setContentView(R.layout.activity_layout2);
}

}

ドキュメントはこちら: https://developer.android.com/guide/topics/resources/runtime-changes.html

于 2021-08-24T13:07:15.420 に答える
-1

resources の下に values-(必要な構成 - 例: land,portrait) フォルダーを追加し、この構成に必要なレイアウトを指定できます。それと同じくらい簡単です。

詳細については、以下のリンクをチェックしてください - http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters

于 2014-09-11T05:34:38.270 に答える