web-dev-qa-db-ja.com

レイアウトの最大幅を設定する方法

多くのグーグル検索を行った後、この問題の解決策を見つけることができません。私はこのレイアウトを持っています:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:id="@+id/adlayout"
          Android:layout_width="fill_parent"
          Android:layout_height="fill_parent"
          Android:orientation="vertical">
<TableLayout
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:stretchColumns="1"
   Android:layout_weight="1"
  >

  <TableRow Android:id="@+id/tableRow1" Android:layout_width="fill_parent"   Android:layout_height="wrap_content">
       <TextView Android:padding="6dip" Android:text="@string/barcode_format"  Android:id="@+id/textView1" Android:layout_width="wrap_content"   Android:layout_height="wrap_content"></TextView>
       <EditText Android:padding="6dip" Android:layout_width="fill_parent" Android:id="@+id/edit_barcode_format" Android:layout_height="wrap_content"></EditText>
  </TableRow>
  <TableRow Android:id="@+id/tableRow1" Android:layout_width="fill_parent" Android:layout_height="wrap_content">
      <TextView Android:padding="6dip" Android:text="@string/barcode_type" Android:id="@+id/textView2" Android:layout_width="wrap_content" Android:layout_height="wrap_content"></TextView>
      <EditText Android:padding="6dip" Android:layout_width="fill_parent" Android:id="@+id/edit_barcode_type" Android:layout_height="wrap_content"></EditText>
  </TableRow>        
 </TableLayout>


</LinearLayout>

テーブルレイアウトはフォームを定義します。電話では問題ないように見えますが、タブレットでは、edittextビューが大きすぎます。レイアウトの最大幅を設定し、フォームを中央にペイントします。

23
MaikoMobile

状況に対処する適切な方法は、電話用の既存のファイルを使用しながら、タブレット用のフォームビューを最適化するために個別のレイアウトファイルを作成することです。これを行うには、個別のres/layoutディレクトリを作成し、それに画面サイズや解像度の修飾子を付加します。

利用可能なリソース修飾子の詳細については、こちらをご覧ください here 。ここには多くの選択肢があり、アプリケーションに最適なものを選ぶためにあなたに任せますが、ここに簡単な例があります:

現在のレイアウトファイルがform.xmlであるとします。

既存のレイアウトファイルをres/layout/form.xmlに配置します。これにより、デフォルトのレイアウトになります。

別のファイルを作成し、res/layout-large/form.xmlに配置します。このレイアウトファイルは、物理画面サイズ> 5 "(すべて標準タブレット)のデバイスで使用されます。問題を処理するために、フォームを水平方向に中央に表示し、画面幅の60%のみを占めるようにデフォルトレイアウトを変更しました:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/adlayout"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="horizontal"
    Android:gravity="center_horizontal"
    Android:weightSum="1" >

    <TableLayout
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.6"
        Android:stretchColumns="1" >

        <TableRow Android:id="@+id/tableRow1">

            <TextView
                Android:id="@+id/textView1"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="6dip"
                Android:text="Barcode Format" >
            </TextView>

            <EditText
                Android:id="@+id/edit_barcode_format"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="6dip" >
            </EditText>
        </TableRow>

        <TableRow Android:id="@+id/tableRow1">

            <TextView
                Android:id="@+id/textView2"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:padding="6dip"
                Android:text="Barcode Type" >
            </TextView>

            <EditText
                Android:id="@+id/edit_barcode_type"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="6dip" >
            </EditText>
        </TableRow>
    </TableLayout>

</LinearLayout>

この変更では、weightSumlayout_weightおよびLinearLayoutプロパティを使用します。これらのプロパティは、親の60%(layout_weight=0.6)のみを埋めるようにテーブルに指示します。これは、特にデバイスに可変解像度とアスペクト比がある場合、最大幅を設定しようとするよりも効率的です。

参考までに、XMLにある不要な属性のうち、不要な属性(複数のxmlns:Android宣言など)を作成するだけであるものも削除しようとしました。これらの変更の1つは、TableLayoutがこれらのパラメーターをすべて無視し、その子が特定の制約を使用するように強制するため、TableLayout子から余分なlayout_パラメーターを削除することでした。ドキュメントから:

TableLayoutの子は、layout_width属性を指定できません。幅は常にMATCH_PARENTです。ただし、layout_height属性は子によって定義できます。デフォルト値はWRAP_CONTENTです。子がTableRowの場合、高さは常にWRAP_CONTENTです。

TableLayoutSDKドキュメントで の詳細を読むことができます。

HTH

14
Devunwired

@Devunwiredが示唆したように異なるレイアウトファイルを保持することは正しいことですが、プロジェクトが複雑になります(デザイナーがビューレイアウトを再設計する場合に備えて、複数のファイルを維持する必要があります)。

必要なのがボタンの幅を変更することだけであれば、次のことをお勧めします。レイアウトフォルダーに1つのxmlファイルを保持し、値を指定します

<LinearLayout
    style="@style/width_match_parent_max_200"
    Android:layout_height="wrap_content">

values-w600dp/styles.xmlに含まれるもの

<resources>
    <style name="width_match_parent_max_200">
        <item name="Android:layout_width">200dp</item>
    </style>
</resources>

values/styles.xmlに含まれるもの

<resources>
    <style name="width_match_parent_max_200">
        <item name="Android:layout_width">match_parent</item>
    </style>
</resources>

編集:フォルダーがvalues-w600dpであり、values-600dpではないことに注意してください

46
kouretinho

LinearLayoutから拡張し、必要な幅で制限する新しいViewGroupを作成する必要があります。 この回答 を参照してください。

2
dmon

ConstraintLayoutを使用します。内部では、これらのプロパティを最小/最大幅/高さに使用できます。

  • app:layout_constraintWidth_min
  • app:layout_constraintWidth_max
  • app:layout_constraintHeight_min
  • app:layout_constraintHeight_max

制約に一致するようにビューの幅/高さを設定することを忘れないでください(0dp)。

0
Cristan

この BoundedViewsライブラリ は、maxWidth/maxHeightに制約を設定するのに役立ちます

0
Bao Le