130

マイナスマージンのデモ:

                         ここに画像の説明を入力

シナリオ

ビューの 1 つに負のマージンを設定してビューをオーバーラップさせ、別のビューのバウンディング ボックスに侵入させます。

考え

必要に応じて、レイアウトのオーバーラップで期待どおりに機能するようです。しかし、無意識のうちに正しいことをしていないために、より大きな問題に遭遇したくありません。エミュレーター、物理デバイス、名前を付けます。負のマージンを使用すると、すべてが正しく機能しているように見えます。あるビューが別のビューの境界ボックスに侵入し、レイアウトでの宣言方法に応じて、他のビューの上または下になります。

API 21以降、ビューを他のビューの上または下に表示するように属性をtranslationZ設定できることも認識していますが、私の懸念は基本的に、属性のドキュメントでマージン値が正でなければならないことが明確に指定されているという事実から来ています。私の引用:elevationlayout_margin

抜粋:
このビューの左、上、右、および下に余分なスペースを指定します。このスペースは、このビューの境界の外にあります。マージン値は正でなければなりません。「14.5sp」などの単位が追加された浮動小数点数であるディメンション値である必要があります。使用可能な単位は次のとおりです: px (ピクセル)、dp (密度に依存しないピクセル)、sp (優先フォント サイズに基づいてスケーリングされたピクセル)、in (インチ)、mm (ミリメートル)...

最初にこの質問をしてから何年もの間、負のマージンで問題が発生したことはありません。負のマージンをできるだけ使用しないようにしましたが、問題は発生しませんでした。それが心配です。

4

8 に答える 8

208

2010 年、@RomainGuy (Android のコア エンジニア) は、負のマージンには未規定の動作があると述べました。

2011 年に @RomainGuy は、 と で負のマージンを使用できるLinearLayoutRelativeLayout述べました。

2016 年、@RomainGuy は、公式にサポートされたことはなく、今後もサポートされないと述べましたConstraintLayout

ただし、この制限を回避するのは簡単です。

ベース ビューの下部にヘルパー ビュー (高さ 0dp、親に制約された幅) を追加し、下部に必要な余白を追加します。
次に、ビューをこの下に配置して、サポートされていない負の値を使用することなく、効果的に「負の」マージンを設定できるようにします。

于 2012-05-20T12:53:20.060 に答える
13

translationX負のマージンの代わりに、とを使用できます translationY

例:

android:layout_marginBottom = -2dp

android:translationY = -2dp

更新: ビュー全体が翻訳されていることに注意してください。

于 2021-02-23T15:15:22.193 に答える
5

過去には悪い習慣だったかもしれませんが、Material Design とそのフローティング アクション ボタンを使用すると、避けられず、多くの場合に必要になるようです。基本的に、2 つの別個のレイアウトがあり、それらが明確に別個の処理 (たとえば、ヘッダーとコンテンツを考えてください) を必要とするために 1 つの RelativeLayout に入れることができない場合、FAB をオーバーラップさせる唯一の方法は、それらの 1 つから突出させることです。負のマージンを使用したレイアウト。これにより、クリック可能な領域に別の問題が生じます。

于 2014-12-21T12:03:31.093 に答える
3

私にとって、TextView に負のマージンを設定することについて (OP が ViewGroup を参照していることは認識していますが、負のマージンの設定に関する問題を探していて、ここにたどり着きました)... 4.0.3 で問題が見つかりました ( API 15) のみ、および-2dp などの負の値android:layout_marginTopの設定。android:layout_marginBottom

何らかの理由で TextView がまったく表示されません。ビューから「なくなった」ように見えます(見えないだけではありません)。

これを他の 3 つのバージョンの layout_margin で試したところ、問題は見られませんでした。

これは実際のデバイスでは試していないことに注意してください。これは 4.0.3 エミュレーターを使用しています。これは、4.0.3 にのみ影響することがわかった 2 番目の奇妙なことなので、新しいルールは常に4.0.3 エミュレーターでテストすることです :)

android:lineSpacingExtra="-2dp"たまたま持っていたとしても、 whichを使用して TextView の下マージンを減らすことに成功しましたandroid:singleLine="true"(したがって、行間が要因になるとは思いもしませんでした)。

于 2014-10-03T10:09:05.083 に答える
0

私はそれがかなり短い期間だけ可能であることを知っていました. しかし、私はそれに問題はないと思います。画面サイズなどに注意して、画面に重なって表示されるべきではないアイテムを誤って作成しないようにしてください。(つまり、テキストの上にテキストを配置するのは、おそらく悪い考えです。)

于 2012-05-20T12:49:03.807 に答える