11

私は少しハックを使用して、親の内部のビューを拡大し、RelativeLayout左上から始まり、中央下で終わるようにしました。何かをRelativeLayoutそれ自体の中心に配置することはできますが、同じポイントまで何かを伸ばすことはできないようです。

私の解決策は単純で、その中心に何かを配置し、親の実際の中心になるように1pxの寸法を与えRelativeLayoutます。誤解しないでください。これは機能し、問題はまったくありませんが、これについてもっと良い方法があれば知りたいと思います。

私が話していることのグラフィカルな表現については、いくつかの画像を追加して説明します。

                                                ここに画像の説明を入力してください

この最初の画像は、TextViewの中央にテキストなしで配置されてRelativeLayoutおり、幅を0dpにしました。これにより、次の画像でわかるように、その中心を基準にして何でも配置できます。私のポイントは、中央に追加のビューを追加する必要なしにそれを行うことができないというのは奇妙なことです。なぜなら、Layout to left ofまたはLayout to right ofようなプロパティを見ることができるからです。 Layout to center of

                                                 ここに画像の説明を入力してください

ですから、シナリオは「まだ壊れていませんが、すぐに飛び出すのではないかと思います」という行にもう少し入っているかもしれません。一方、これが正しい方法であり、誰かが新しいことを学ぶのを手伝うなら、それは私にとってもうまくいきます。

答えられない質問をするのはなぜですか!?私はここで賞金を設定しています。

(私の判断では)これまでに提案された最も賢明なことは、わずかに少ない場合でも、メモリの消費量が少し少ないと思わLinearLayoutれるものに置き換えることです。Viewだから私は@yorkwに感謝しています。これまで誰もこれを聞いていないことに驚いています。

私が実際に何を求めているのかについて誤解があるように思われるので、明確にするためだけに。親の幅/高さの半分を取るものは必要ありません。私はそれを参照点として使用する方法を求めていました(それは私がタイトルで言ったことです)ので、半分と重力を残す線形レイアウトを追加せずに中央の左側に画像を配置するなどのことができますまたは何でも。

アップデート

API 14以降、この種のハッキングにより適しSpaceた軽量のViewサブクラスが利用可能になりました。

4

6 に答える 6

7

私はあなたの現在の解決策が好きです、しかしあなたがファンキーな目に見えない薄いセンタリングウィジェットを避けたいならば、あなたは次のようにそれを達成することができます:

  • 含まれているRelativeLayoutから派生したクラスのピクセル幅としてcontainerWidthを計算します(これをMyRelativeLayoutと呼びます)
  • leftHalfWidgetLayoutParamsという名前のMyRelativeLayout.LayoutParamsのインスタンスを作成します
  • leftHalfWidgetLayoutParams.width = containerWidth / 2を、上で作成するとき、または事後にコンストラクター引数を使用して設定します。後で調整する場合は、事後が必要です(たとえば、MyRelativeLayoutのonSizeChanged()のオーバーライドで)。
  • leftHalfWidgetLayoutParams.widthを設定または変更するたびに、leftHalfWidget.setLayoutParams(leftHalfWidgetLayoutParams)を呼び出します。
  • 幅が変わるたびにMyRelativeLayoutを再描画する必要がある場合は、requestLayout()を呼び出します

中央の右側にあるウィジェットが大きすぎる場合は、ウィジェットがコンテナの左半分に侵入するのを防ぐために、レイアウト幅の値も明示的に設定する必要がある場合があります。

これにより、RelativeLayoutにすべてを自動的に実行させるという「魔法」の一部が失われることに気付きました。これが、実際のアプローチの方が優れている点です。ただし、leftHalfWidgetのレイアウトパラメーターに追加される幅の制約が追加されているため、RelativeLayoutはウィジェットの相対位置を可能な限り強制するため、全体をオーバーライドしたり放棄したりすることはありません。その点での貢献。

上記の方法でレイアウトパラメータの幅の値を明示的に設定せずに、RelativeLayout内で要件を満たす方法を考えることはできません。これはあなたの代替アプローチですが、必ずしもより良いアプローチではありません。

左半分のウィジェットが常にコンテナーの左半分を占める場合、トップレベル(重み0.5 )に(RelativeLayoutではなく)水平LinearLayoutがなぜあるのかわかりません。残りの右半分に同じ重みの右側のRelativeLayoutを使用する左側のサイズのウィジェットの場合)は、適切なソリューションではありません。その場合、「相対的な」ものはとにかくその右半分の範囲内でのみ発生するので、LinearLayoutがより簡潔に作業を実行できるのに、なぜトップレベルでRelativeLayoutを使用するのでしょうか。ただし、垂直関係を処理するために左側でRelativeLayoutを使用したい場合は、実際にはその左側に複数のコントロールがある可能性があります。

于 2012-05-30T04:01:31.143 に答える
1

あなたがしていることを達成するために、私はLinearLayout、layout_width = 0dip、layout_weight=50を使用します。ただし、線形レイアウト内に別のレイアウトをネストするため、最適ではありません。別のより良い解決策が利用可能かどうかを知りたいと思います。

于 2012-05-25T09:53:54.053 に答える
1

LinearLayoutを使用する方が良いと思います。属性「layout_weight」を使用すると、LinearLayoutは多くの問題を解決できると思います。LinearLayoutを使用するには、LinearLayout内に別の空のビューも必要ですが、LinearLayoutが大好きです:)これが私のコードです

<LinearLayout android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:background="@drawable/your_image">
    <Button android:layout_height="fill_parent"
        android:layout_width="0dip"
        android:layout_weight="1.0"/>
    <View android:layout_height="fill_parent"
        android:layout_width="0dip"
        android:layout_weight="1.0"
        android:visibility="invisible"/>
</LinearLayout>

ついに、私の英語が下手でごめんなさい。

于 2012-05-27T14:39:25.647 に答える
1

それはちょっと不安定なようです。私はそのレイアウトのフォローアップ作業をしている人になりたくありません。ただし、実際には、この問題に対処するには、LinearLayoutとウェイトを使用する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    android:weightSum="2" >

    <Button
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#00ff00"
            android:text="@string/hello" />
</LinearLayout>

上記をそのままRelativeLayoutに埋め込むことができます。RelativeLayoutの各直接の子には開発者定義の役割があるため、両方向にfill_parentを持つLinearLayoutの子がRelativeLayoutの別のレイヤーであることが簡単にわかります。

別のコメントに記載されているように、任意の空のビューを特定のlayout_weightで挿入するか、上記のように、残りが暗黙的に示されるようにweightSumを割り当てることができます。上に色を追加しました。これがきれいな写真です

かわいい写真

于 2012-06-02T05:25:30.600 に答える
1

現在、Androidには、レイアウトの中心を参照ポイントとして使用するのに役立つものは組み込まれていません。ただし、他の回答で上記で提案されているように、一部の拡張機能とハックのみを使用してこれを実現できます。Androidがすでにこのための何かを持っている場合、Androidはこれらの回答のいくつかと同じ量の計算を実行し、機能します。ですから、それは同じですが、それを内蔵していれば間違いなくきれいに見えます。

于 2012-06-02T18:28:32.883 に答える
1

サポートライブラリのPercentRelativeLayoutを使用できます。

  1. プロジェクトに含めます。compile 'com.android.support:percent:23.4.0'

  2. PercentRelativeLayoutの代わりにを使用してくださいRelativeLayout

  3. ボタンの幅を親の50%にします。app:layout_widthPercent="50%"

新しいレイアウトは、すばやく簡単に使用できるようです。その唯一の本当の欠点は、ホーム画面ウィジェットで使用できないことだと思います。

于 2016-05-19T04:27:51.207 に答える