常にandroid:configChanges =“ keyboardHidden | orientation”を使用しないのはなぜですか?


178

なぜandroid:configChanges="keyboardHidden|orientation"すべての(ほぼすべての;))アクティビティで使用しないのか疑問に思っていましたか ?

品:

  • あなたの活動がローテーションされることを心配する必要はありません
  • 速いです

あまり良くない:

  • 画面サイズに依存している場合は、レイアウトを変更する必要があります(例:2列のレイアウトなど)

悪い:

  • さまざまな向きでさまざまなレイアウトを作成するための柔軟な方法がない
  • フラグメントを使用するとあまり良くない

しかし、異なるレイアウトを使用しないのであれば、なぜでしょうか?


6
また、あなたが何かを説明すべきだと思う向きがやっている| keyboardHidden
ブランデル

これは、指定された構成変更のネイティブ処理の使用を防止し、アプリケーションがそれを処理できるようにしますよね?
Mikooos '19年

2
このため、このオプションが用意されています。何をしているのか(リソースに変更はない)がわかっている場合は、それを使用してください。
ポインタnull

なぜScreenSizeを使用するよりも速いのですか?
batmaci 2017年

回答:


334

簡単な背景

デフォルトでは、Androidで特定の主要な構成変更が発生すると(一般的な例は方向の変更です)、Androidは実行中のアクティビティを完全に再起動して、そのような変更に適応できるようにします。

android:configChanges="keyboardHidden|orientation"AndroidManifestで定義するときは、Androidに次のように伝えます。「キーボードが引き出されたとき、または電話が回転したときにデフォルトのリセットを行わないでください。これを自分で処理したいのです。そうです。 」

これは良いことですか?すぐに...

心配ない?

あなたが最初に始める長所の1つは、

あなたの活動がローテーションされることを心配する必要はありません

多くの場合、向きの変更(「回転」)によって生成されるエラーがある場合、を挿入するだけで簡単に修正できると誤って信じていますandroid:configChanges="keyboardHidden|orientation"

ただし、android:configChanges = "keyboardHidden | orientation"は、絆創膏にすぎません。実際には、構成の変更をトリガーする方法はたくさんあります。たとえば、ユーザーが新しい言語を選択した場合(つまり、ロケールが変更された場合)、方向の変更と同じ方法でアクティビティが再開されます。必要に応じて、すべての異なるタイプの構成変更のリストを表示できます。

編集:さらに重要なことに、ハックボッドがコメントで指摘しているように、アプリがバックグラウンドにあり、Androidがメモリを解放してメモリを解放することを決定した場合にも、アクティビティが再開されます。ユーザーがアプリに戻ると、Androidは他の構成変更があった場合と同じようにアクティビティを再開しようとします。それを処理できない場合-ユーザーは満足できません...

つまり、android:configChanges="keyboardHidden|orientation"「心配」の解決策にはなりません。適切な方法は、Androidがスローする再起動に満足できるようにアクティビティをコーディングすることです。これは、道を進むときに役立つ良い習慣なので、慣れます。

それで、いつそれを使うべきですか?

あなたが述べたように、明確な利点があります。ローテーションのデフォルトの構成変更を自分で処理して上書きすると、処理が速くなります。ただし、この速度には利便性の代償が伴います。

簡単に言うと、縦長と横長の両方に同じレイアウトを使用している場合は、上書きを行うことで適切な状態になります。アクティビティを本格的にリロードする代わりに、ビューは単純にシフトして残りのスペースを埋めます。

ただし、デバイスが横向きのときに何らかの理由で別のレイアウトを使用する場合、Androidがアクティビティをリロードすると、正しいレイアウトが読み込まれるので問題ありません。[そのようなアクティビティでオーバーライドを使用し、実行時に魔法のような再レイアウトを実行したい場合...まあ、幸運-それは単純ではありません]

簡単なまとめ

ぜひ、android:configChanges="keyboardHidden|orientation"あなたに合っているなら、それを使ってください。しかしPLEASE姿勢の変化がフル活動再開をトリガすることができる唯一の方法ではありませんので、ときに何かが変化し、何が起こるかテストしてください。


50
再起動されるアクティビティを処理しないことは、あまり一般的でない構成変更を処理しないことよりも大きな問題があることを意味します。ここで使用されるアクティビティの再開は、アプリがバックグラウンドで強制終了されたときにAndroidがアクティビティを以前の状態に復元する方法とまったく同じメカニズムです。そのため、これを正しく行わないと、プロセスが強制終了されたかどうかに応じて、バックグラウンドからアプリに戻ったときにユーザーにアプリがランダムに正しく戻らないことが発生します。そのため、大きなメリットとして、アプリが正しく再起動することが保証されます。
ハックボッド

14
Android 3.x以降では、「screenSize」の追加をお見逃しなく---------- android:configChanges = ["mcc"、 "mnc"、 "locale"、 "touchscreen"、 "keyboard"、 「keyboardHidden」、「navigation」、「screenLayout」、「fontScale」、「uiMode」、「orientation」、「screenSize」、「smallestScreenSize」]
Michael Biermann

1
configChanges属性を使用すると、アプリが方向ロック機能も無視することに気付きました。どうすればこれを解決できますか?あなたは答えを知っていれば、それをここに書いてください:stackoverflow.com/questions/24000361/...
Androidデベロッパー

4
Please don't do the default reset when the keyboard is pulled outキーボードを引き出すためのアクティビティの再起動を見たことがない!
Muhammad Babar 2014

....も時折再起動は、これが問題になる可能性がアプリケーション内の他のタイプでも多分...私のために私の意見... configChangesハンドルほとんどのケースでOKですが、それは本当に依存
Renetik

2

私の観点から:レイアウトが横長モードと縦長モードの両方で同じである場合、アプリで2つのうち1つを無効にすることもできます。

私がこれを述べた理由は、ユーザーとして、私が向きを変更したときに、アプリが私にいくつかの利益を提供することを期待しているからです。スマートフォンの持ち方が問題にならないのであれば、選択肢は必要ありません。

たとえば、ListViewがあり、ListItemをクリックすると、そのアイテムの詳細ビューが表示されるようにするアプリを例にとります。横向きの場合は、画面を2つに分割して、左側にListView、右側に詳細ビューを表示します。Portraitでは、1つの画面にリストが表示され、ListItemが選択されたときに画面が詳細ビューに変更されます。その場合、向きの変更は、さまざまなレイアウトと同様に理にかなっています。


4
ええ、私たちはそれを私たちのアプリのバージョン1.0で行って、Appleのリリースに合わせました。それは肖像画でのみ提示されました。私のDroid Xで見栄えが良かったので、IOSバージョンのポップアップキーボードの動作と正確に一致しました。次に、CFOは彼のドロイドにアプリをインストールし、それを横に向けて、キーボードをスライドさせて開きました。おっとっと。Androidはオープンプラットフォームであり、ハードウェア構成やユーザーが何をしたいのかを実際に予測できないため、万が一に備えて両方(すべて)の方向をサポートする必要があります。
Tevo D

1
これは、基本的にハードウェア内にあるため、横向きではなく通常の向きであったため、偶然に縦向きのみの設定を上書きしました。これは本当に私たちのレイアウトを台無し:(とかなりのアプリをインストールし、彼の秒以内に大きな欠陥を持つ、恥ずかしいた
TEVO D

1
なぜiOSとまったく同じように動作させようとしたのですか?:(
FunkTheMonk

7
@FunkTheMonk残念ながら、私たちはビジネスマンが技術的な決定を下す世界に住んでいます。あなたがそれに反対する場合でも、彼らはとにかく彼らが正しいと思う半分の時間。そして彼らはあなたの給料を制御します。
StackOverflowed 2012年

2
レイアウトを1つだけ使用しても、画面が回転しても同じように見えるというわけではありません。適切に構造化されたXMLレイアウトを使用すると、適切なディメンションで適切に機能するように自動的にシフトし、ユーザーはそれを高く評価します。
Melinda Green

-1

理由はわかりません。..たまに再起動しても大丈夫です... configChangesがほとんどの場合を処理してくれます...たぶんいくつかのタイプのアプリケーションではこれは問題になるかもしれませんが、それは本当にアプリケーションのタイプとどのように復元するかに依存しますアプリの再起動時の状態...アプリのいずれかが再起動すると、ユーザーがログバックされ、最後のアクティビティがコードによって開かれ、ユーザーjusは以前の場所に戻るためのいくつかの手順を失いますが、大したことではありません。他の一部の状態は常に持続し、一部の状態は、再起動時に常に復元されます。アクティビティが再開されたときは、そのアプリが使用されていないか何かである必要がありました...まったく問題ありません...たとえば、ゲームでは、これはおそらく問題になるか、他の種類のアプリではわかりません...

このようにすると、アプリケーションは通常の状況で正常に機能するようになります。そして、コードははるかに読みやすくなり、新しいバグを作成し、常にそれを維持する必要がある場所を保存および復元するために必要な大量のロジックがありません... Androidが電力を失い、アプリケーションウィンドウを強制終了すると、コンテキストが失われ、再び始まりますが、これは特別な状況でのみ発生し、新しいデバイスではこれがますます珍しくなります...

だから私を殺してください、しかし私はこれをアプリケーション全体でかなりうまく使います... android:configChanges = "locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize"しかし、いくつかの特別な種類のアプリケーションでは、良い方法ですが、ほとんどのアプリはこれで十分です。


こんにちは、このトピックに詳しい人が私のスレッドを見てください:stackoverflow.com/questions/35941585/…?必死に助けが必要です。
ルークアリソン

アクティビティの保存/再開を完全にサポートする必要があります...ローテーションでの処理に違いはありません...いくつかのステップを失うと言います...適切に実行すると、ステップを失うことはなく、ユーザーが中断したところから正確に復元します...デバイスの再起動後も。
HaMMeReD 2016

私はあなたが何を話しているのか分かりませんが、こうすることで、アプリケーションが通常の状況で正常に機能するようになります。そして、コードははるかに読みやすくなり、新しいバグを作成し、常にそれを維持する必要がある場所を保存および復元するために必要な大量のロジックがありません。再び始まりますが、これは特別な状況でのみ発生し、新しいデバイスでは、これはますますまれです...
Renetik

アクティビティコントラクト(状態の保存/復元)の遵守を無視することは悪い習慣であり、これは全体的にひどいアドバイスです。プロセスの死をテストし、アプリがどこに到達するかを確認します。ユーザーが電話で2〜3個のアプリを使用し、アプリを切り替える場合、この動作は完全に標準の「通常の状況」です。
EpicPandaForce

-3

一時停止すると、プレーヤーを解放するよりも速くなると思います。それでも一時停止します。

曲を一時停止しない解決策を見つけました。

画面の向きの構成変更を処理し、onConfigurationChangedメソッドを使用してレイアウトファイルを読み込むことをマニフェストに記述します。logCatでこれを実行すると、onPause、onCreate、onResumeが呼び出されないため、曲が一時停止されないことがわかります。

  1. マニフェストを更新して向きを処理します。

    android:configChanges="orientation|screenSize"
  2. このコードを追加

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

音楽を再生するには、サービスを使用する必要があります。真剣に、「// TODO自動生成されたメソッドスタブ」がまだあるコードを追加するように人々に伝えています。ずさんな解決策。それもうまく機能しません。すべての参照を再バインドする必要があります。そうしないと、最高で予測不可能になります。
HaMMeReD 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.