1

私は相対的なレイアウトを学び、ログインページをシミュレートするための小さなテストレイアウトを作成しました。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_height="match_parent"
            android:layout_width="match_parent">
    <TextView android:id="@+id/labelUsername"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:text="username:"
          android:layout_centerVertical="true"/>
    <EditText android:id="@+id/txtUsername"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:hint="input username here"
          android:layout_toRightOf="@id/labelUsername"
          android:layout_alignBaseline="@id/labelUsername"/>
    <TextView android:id="@+id/labelPassword"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:text="password:"
          android:layout_below="@id/txtUsername"
          android:layout_alignParentLeft="true"/>
    <EditText android:id="@+id/txtPassword"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:hint="input password here"
          android:layout_below="@id/txtUsername"
          android:layout_alignLeft="@id/txtUsername"
          android:layout_alignBaseline="@id/labelPassword"/>
</RelativeLayout>

私が欲しいのは、Username LabelとをとTextfieldの上にPassword Label置くことですTextField。しかし、結果は元に戻され、パスワードは上にあります!

問題はの「android:layout_below」プロパティだと思います。labelPassword以下に設定すると機能しますが、ラベルよりもはるかに大きいlabelUsernameため、この場合は両方がオーバーレイされます。なので、以下を作ってみますが、おかしな動作で、わかりません。textfieldtextfieldslabelPasswordtxtUsername

ちなみに、相対レイアウトでレイアウトを作成する際のガイドラインはありますか?

最初は何を置けばいいですか?

やっと何を入れたらいいの?

ありがとう!

4

3 に答える 3

2

具体的な質問に答えるにandroid:layout_centerVertical="true"は、labelUsernameに適用しているルールが原因です。

参照している要素が中央に配置されている場合、相対位置がうまく機能していないようです。また、この場合は、ユーザー名フィールドだけでなく、フォーム全体を中央に配置して、パスワードを次のように配置する必要があるため、意味がありません。

要素を含む要素(別の相対レイアウト、線形レイアウト、テーブルレイアウトなど)に配置し、その要素を中央に配置できます。それはうまくいきます。または、すべてのコンテンツを中央に配置するandroid:gravity="center"ために、含まれているレイアウトに追加できます。

于 2012-07-04T17:51:01.820 に答える
2

ここで達成しようとしているのは、ユーザー名とパスワードの両方のフィールドを垂直方向の中央に配置し、パスワードフィールドをユーザー名フィールドの下に配置することだと思います。レイアウトのエラーは、ユーザー名textviewとedittextに垂直方向に中央揃えするように指示するだけであり、相対レイアウトでは、レイアウトを配置した後にレイアウトを中央揃えにすることです。したがって、ユーザー名フィールドは中央に配置され、パスワードは上に残されます。

あなたがすべきことは、parent(RelativeLayout)にそのすべての子要素を垂直方向に中央揃えするように指示することです。

そのためには、「username」TextView要素からこの属性を削除するだけです。

android:layout_centerVertical="true"

RelativeLayoutそして、この属性を要素に追加します。

android:gravity="center_vertical" //tells RelativeLayout to vertically center all child elements

この場合、私はを使用することをお勧めしますが、今のところLinearLayout使用を続けることができますRelativeLayout。それが役に立てば幸い!

于 2012-07-04T18:09:43.133 に答える
1

さまざまなレイアウトを見ていくと、CSSを介して物を配置することに慣れている場合、たとえば(絶対位置または相対位置で)相対レイアウトが最も「自然」に感じられることがわかります。ここで説明している状況では、次のいずれかが必要です。線形またはテーブルレイアウト。テーブルのレイアウトは、「フォーム」に関連するものすべてにおそらく最善の策です。テーブル要素(列)には、通過する列の数を詳細に示すlayout_span属性が必要です(HTMLのcolspanに似ています)。

上記のRelativeLayoutで具体的に何が問題になっているのかわかりません。十分な試行錯誤を繰り返すことで、おおよその目的を達成できると確信していますが、作業に適したツールを使用することを強くお勧めします。 。

LinearLayoutも素晴らしいツールです(これは無期限にネストできることを覚えておく必要があります)。レイアウトにweightSumを指定すると、各アイテムにlayout_weightを設定でき(合計すると合計になります)、layout_widthは0dpになります(直感的ではありませんが、そのように機能します)。それはまた、物事を本来あるべき場所に置くための素晴らしい方法でもあります。

最後に、RelativeLayoutの正しい順序に対する答えは、アイテムが下から上にZオーダーされているため、アイテムが兄弟の順序で表示されるのが遅いほど、Zオーダーが高くなるということです。それ以外の場合、それらの順序は関係ありません。

于 2012-07-04T17:24:46.390 に答える