1

私のユーザー インターフェイスには、RelativeLayout を持つフラグメントがあります。この RelativeLayout の下部には、2 つのボタンがあります。1 つは左側に、もう 1 つは右側に配置し、その間に空白を配置します。左のものは静的なテキストです (ただし、アプリは翻訳されるため、幅がどのくらいになるかはわかりません)。右側のテキストは任意に変更できます。

私はすでに RelativeLayout を持っているので、次のように RelativeLayout 内に配置しようと始めました。

<Button
    android:id="@+id/button_left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="@string/left" />

<Button
    android:id="@+id/button_right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:text="@string/right" />

しかし、これには、右側のボタンのテキストが長すぎると、左側のボタンに重なってしまうという問題があります。

次に、 を追加して右側のボタンの左端を制限しようとしましたandroid:layout_toRightOf="@+id/button_left"が、これを使用すると、右側のボタンが常に使用可能な幅を埋めてしまいます。右側のボタンのテキストが短い場合は、縮小して左側のボタンとの間に隙間ができるようにします。

次に LinearLayout を使用しようとしたので、次のようにボタンに layout_gravity を設定できました。

<LinearLayout
    android:id="@+id/buttons"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/button_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/left" />

    <Button
        android:id="@+id/button_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:drawableLeft="@drawable/pass"
        android:text="@string/right" />

</LinearLayout>

まだ喜びはありません。私はこれがうまくいくと思っていましたが、画面の右端にくっつくのではなく、右側のボタンが左側のボタンのすぐ右側にとどまります。レイアウト エディターで、LinearLayout が画面の幅を正しく埋めていることがわかりますが、ボタンは頑固にその友達の横にとどまります。

android:layout_weight="1"右側のボタンにも追加しようとしましたが、繰り返しますが、使用可能なスペースを埋めるために常に拡張されました。

次に、次のように、ボタンの間に空のビューを追加して、右側のボタンを展開して強制的に右側に配置しようとしました。

<LinearLayout
    android:id="@+id/buttons"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/button_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/left" />

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/button_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/right" />

</LinearLayout>

これは、元の RelativeLayout と同じように、テキストが短い場合は正常に機能しますが、右側のボタンのテキストが長い場合、その幅は使用可能なスペースではなく画面の幅によって制限されるため、はみ出します画面の右端。繰り返しますが、レイアウト エディターで LinearLayout の幅が正しいことを確認できますが、ボタンは親の境界を拡張しています。これは、ボタンに があっても発生しますandroid:layout_width="match_parent"。奇妙なことに、右側のボタンの layout_gravity を大きくすると、使用可能なスペースに収まるまで小さくなりますが、もちろん、テキストが小さい場合はスペースを埋めることにもなります。

これを正しくするのがこんなに難しいなんて信じられない。私は SO で同様の質問を 6 つ見てきましたが、すべて簡単な回避策があります。ボタンのテキストが固定されている場合は、余白を手動で固定幅に設定できます。拡張ウィジェットが Button ではなく TextView である場合は、拡張してウィジェットandroid:gravity内のテキストを移動するために使用できますが、背景と境界線が画面に表示されるため、ボタンでそれを行うことはできません。

4

3 に答える 3

1

LinearLayout を追加するのは間違ったアプローチだったことが判明しました。android:layout_toRightOf="@+id/button_left" android:layout_alignParentRight="true"外観を変更せずに使用可能なスペースを吸収できるため、TextViewを使用すると問題なく動作します。レイアウトを変更しようとする代わりに、拡張して使用可能なスペースを埋め、Button を含むもの、つまり FrameLayout を使用する必要があります。作業コードは次のとおりです。これは、ルートの RelativeLayout 内にあります。

<Button
    android:id="@+id/button_left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="@string/left" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_toRightOf="@+id/button_left" >

    <Button
        android:id="@+id/Turn_button_pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/right" />

</FrameLayout>

これで、FrameLayout は常に左側のボタンの右側のすべてのスペースを占有し、. を使用してそのスペース内に右側のボタンをレイアウトしますandroid:layout_gravity="right"

この回答では、レイアウトを 1 つ追加するだけですが、レイアウト内の ViewGroups の数を最小限に抑えるために、既存の RelativeLayout のみを使用してそれを行う方法がある場合は、それを解決策として受け入れます。

于 2012-10-01T15:20:12.370 に答える
0

TextViewを使用して、ボタンのように見せることができます。ダミーボタンを作成し、背景を抽出して、その背景をプログラムでテキストフィールドに設定します。(テストされていませんが、ボタンの外観を与える必要があります)

Drawable d = button1.getBackground();
textView1.setBackground(d);

次に、onClickListenerを設定するだけで、探しているものが得られます。TextViewは、最初のレイアウトの「button_right」の代わりになります。

**編集

xmlは次のようになります

<Button
 android:id="@+id/button_left"
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
 android:layout_alignParentBottom="true"
 android:layout_alignParentLeft="true"
android:text="@string/left" /> 

<TextView
    android:id="@+id/button_right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"     
    android:layout_alignParentRight="true" 
    android:maxEms="10"
    android:text="TextView" />
于 2012-10-01T15:09:22.310 に答える
0

右ボタンが使用可能なスペースの最大半分しか占有できないという制約を受け入れることができる場合、これが解決策になる可能性があります。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_weight="1" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="A short text" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="A very long text which is limited to one half of the available space" />

    </RelativeLayout>
</LinearLayout>

于 2012-10-01T15:21:21.173 に答える