多くのグーグル検索を行った後、この問題の解決策を見つけることができません。私はこのレイアウトを持っています:
<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ビューが大きすぎます。レイアウトの最大幅を設定し、フォームを中央にペイントします。
状況に対処する適切な方法は、電話用の既存のファイルを使用しながら、タブレット用のフォームビューを最適化するために個別のレイアウトファイルを作成することです。これを行うには、個別の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>
この変更では、weightSum
のlayout_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です。
TableLayout
SDKドキュメントで の詳細を読むことができます。
HTH
@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ではないことに注意してください
LinearLayoutから拡張し、必要な幅で制限する新しいViewGroupを作成する必要があります。 この回答 を参照してください。
ConstraintLayoutを使用します。内部では、これらのプロパティを最小/最大幅/高さに使用できます。
app:layout_constraintWidth_min
app:layout_constraintWidth_max
app:layout_constraintHeight_min
app:layout_constraintHeight_max
制約に一致するようにビューの幅/高さを設定することを忘れないでください(0dp
)。
この BoundedViewsライブラリ は、maxWidth/maxHeightに制約を設定するのに役立ちます