私はどこでも検索しましたが、これを行う方法をまったく見つけることができません:
私のプロジェクトでは、レイアウト用に2つのリソースフォルダーがあります。1つは「layout」と呼ばれ、もう1つは「layout-land」と呼ばれます。これは、現在の向きに応じて使用されるアクティビティごとに2つの別々のレイアウトを持つおなじみの方法です。問題は、アクティビティごとに個別の「レイアウトランド」レイアウトがないことです。また、すべてのアクティビティがランドスケープモードに異なるレイアウトを必要とするわけではありません。
私が行ったことはonConfigurationChanged
、向きの変更が発生しないようにデフォルトをオーバーライドします(configChanges="orientation"
マニフェストに適切なものを使用)。これにより、ユーザーが画面を傾けるたびにバンドルに詰め込むという頭痛の種をたくさん減らすことができました。ただし、実際に向きを変えたい場合もあります。「layout-land」フォルダに対応するレイアウトがあるときはいつでも、通常どおりに向きを変更したいと思います。onConfigurationChanged
ないときはいつでも、向き変更イベントを抑制し たい。
私は、すべてのアクティビティの基本クラスでBaseActivity
ある拡張クラスを作成し、オーバーライドしました。Activity
onConfigurationChanged
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if(...there is a layout-land version of the current activity's layout...)
{
setRequestedOrientation(newConfig.orientation);
}
else
{
// Do nothing, since raising the orientation change event
// to change from a portrait layout to the same portrait layout is silly.
}
}
唯一の問題は、レイアウトリソースのレイアウトランドバージョンがあるかどうかを判断する方法が見つからないことです。現在のレイアウトのリソースID(BaseActivity
オーバーライドによってクラスの他の場所で取得)はすでにわかっていますが、レイアウトの横向きバージョンと縦向きバージョンの両方が同じIDを共有しており、オブジェクトがどちらをsetContentView
簡単に教えてくれるかわかりません。 Resources
IDで特定のリソースを要求したときに表示されるレイアウトのバージョン。これを行う方法が必要です。私は何が欠けていますか?