ListView
の下にボタンを表示したい。問題は、ListView
が拡張される(アイテムが追加される...)と、ボタンが画面から押し出されることです。
重みでLinearLayout
を試しました( Android:ビューにmaxHeightがないのはなぜですか? )。ただし、重みが間違っているか、単に機能しませんでした。
また、RelativeLayout
を使用するヒントをどこかで見つけました。 ListView
は、ボタンの上にAndroid:layout_above
パラメータで設定されます。
これの問題は、後でボタンを配置する方法がわからないことです。私が見つけた例では、ListView
の下のビューはAndroid:layout_alignParentBottom
を使用して調整されましたが、ボタンが画面の下部にくっついて欲しくありません。
SetHeight-methodと必要なスペースの計算を使用する以外のアイデアはありますか?
編集:私は多くの有用な答えを得ました。
bigstoneとuser639183のソリューションalmostは完全に機能しました。ただし、ボタンの下部に余分なパディング/マージンを追加する必要がありました。これはまだ画面から半分押し出されたままになるためです(その後停止しました)
画面の下部にボタンを固定する場合にのみ、相対的なレイアウトに関するAdiniaの答えは問題ありません。それは私が意図したものではありませんが、他の人にとってはまだ役に立つかもしれません。
AngeloSのソリューションは、私が望んでいたエフェクトを作成したため、最後に選んだものでした。ただし、ボタンの周りのLinearLayout
に2つの小さな変更を加えました。
まず、レイアウトに絶対値を入れたくないので、Android:layout_height="45px"
をwrap_content
に変更しました。
次に、ボタンを水平方向の中央に配置する必要があったため、垂直LinearLayout
でのみサポートされていたため、Android:orientation = "horizontal"を "vertical"に変更しました。
AngeloSはまた、最初の投稿で、LinearLayout
の周りのListView
内のAndroid:layout_weight="0.1"
パラメーターが効果があるかどうかわからないと述べました。私はちょうど試してみましたが、実際にそうです!なしでは、ボタンは再び画面から押し出されます。
私はこの正確な問題を抱えていたので、それを解決するためにLinearLayouts
とListView
をそれぞれ格納する2つの別個のButton
を作成しました。そこから両方を別のLinear Layout
に入れ、そのコンテナのAndroid:orientation
をvertical
に設定します。また、LinearLayout
を格納したListView
の重みを0.1
に設定しましたが、それが効果があるかどうかはわかりません。そこから、下のコンテナ(ボタンがある)の高さを好きな高さに設定できます。
[〜#〜] edit [〜#〜]これは私が意味するものです:
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical">
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
>
<ListView Android:id="@+id/ListView01"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent"
Android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="45px"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
上記の解決策は、画面の下部にあるボタンを修正します。
リストの下部でボタンをフロートさせるには、ListView01
の高さをwrap_content
に変更します。
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
>
<ListView Android:id="@+id/ListView01"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="45px"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
この問題をコードで解決し、リストビューの高さを5つ以上のアイテムがある場合にのみ設定しました。
if(adapter.getCount() > 5){
View item = adapter.getView(0, null, listView);
item.measure(0, 0);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
listView.setLayoutParams(params);
}
最大の高さを単一のアイテムの高さの5.5倍に設定していることに注意してください。これにより、ユーザーはスクロールを行う必要があることが確実にわかります。 :)
最後の編集では、Android:layout_above="@+id/butt1"
をListViewコードで。
そして、あなた(そして以前に答えを試した人全員)にあなたが本当に複数のRelativeLayout
を使う必要がないことを示すために、ここに修正されたコード:
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/bkg">
<TextView
Android:id="@+id/textView1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="TextView1"
Android:layout_alignParentTop="true">
</TextView>
<TextView
Android:id="@+id/textView2"
Android:layout_below="@+id/textView1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="TextView2"
Android:layout_centerHorizontal="true">
</TextView>
<Button
Android:id="@+id/butt1"
Android:text="string/string3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_alignParentBottom="true">
</Button>
<ListView
Android:id="@+id/Android:list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="2dip"
Android:layout_marginBottom="2dip"
Android:drawSelectorOnTop="false"
Android:visibility="visible"
Android:layout_below="@+id/textView2"
Android:layout_above="@+id/butt1" />
</RelativeLayout>
および結果、ランダムリストを使用:
LinearLayout
を使用して、ListView
とButton
の高さをwrap_content
に設定し、ListView
にweight = 1を追加します。これはあなたが望むように動作するはずです。
そして、はい、Button
のlayout_gravity
をbottom
に設定します
RelativeLayout
は解決策です。ボタンを最下部に近づけたくない場合は、マージンを追加できます(ボタンをパディングすると、9パッチの背景を使用し、独自のボタンを設定するため、ボタンが壊れます)パディング)。
LinearLayout
を使用した場合も同じになります。目的を達成する方法は、ListView
をheight = 0およびweight = 1に設定し、ボタンのheight = wrap_contentに設定することですおよびweight = 0。 (user639183が述べたように、両方をwrap_contentに設定しても、ListView
の高さは制限されません)。
AngeloSのソリューションに触発され、ネストされたコンテナを使用せずにこれを行う方法を見つけました。
LinearLayout
とボタンがある、垂直方向のListView
を使用しました。 Android:layout_weight="0.1"
はListView
を表します。
常にボタンをリストの一番下に貼り付けることができます。また、リストが大きくなっても、ボタンは画面から押し出されません。
<ListView
Android:id="@+id/notes_list"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0.1"
/>
<Button
Android:id="@+id/create_note_btn"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="onCreateButtonClicked"
Android:text="@string/create_notes"
/>
これが最もクリーンな方法です:
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<ListView
Android:id="@+id/ListView01"
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1"
Android:dividerHeight="2px">
</ListView>
<FrameLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/drawable"
>
<Button Android:background="@drawable/btn_more2"
Android:id="@+id/moreButton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
Angelosのソリューションに似ていますが、ListViewをラップするlinearlayoutは必要ありません。また、LinearLayoutよりも軽いFrameLayoutを使用して、Buttonをラップできます。
ネストされたコンテナを使用して、おそらくこれを機能させることができます。 Buttonを2番目の(内部)コンテナーにラップして、より多くのスペースを取り、Buttonを内部コンテナーの上部に揃える必要がある場合があります。
このような可能性のあるもの:
RelativeLayout
- リストビュー
-RelativeLayout
----ボタン
2つのコンテナで異なる配置オプションを使用すると、これを機能させることができます。
このアイデアは、非常に優れたソリューションで次のように概説されています。
両方とも、少なくともv4.4.3では完全に動作するようです。
私はまだテストコードを書いてそれをチェックアウトし、各メソッドを確認するのにいくらかの時間を費やす必要がありました。以下は、必要最小限の自己完結型のテストコードです。
レイアウトは、ネストされたレイアウトが少ないため、Sparkleのソリューションに基づいています。また、現在のLINTチェックを反映するように更新されました。
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
tools:context="MainActivity" >
<ListView
Android:id="@+id/listview"
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1" />
<Button
Android:id="@+id/btn"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Grow List"
tools:ignore="HardcodedText" />
</LinearLayout>
アクティビティは、自分でソリューションをテストするための定型コードを提供します。
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listview = (ListView)findViewById(R.id.listview);
final ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this,
Android.R.layout.simple_list_item_1,
new ArrayList<String>());
adapter.setNotifyOnChange(true);
listview.setAdapter(adapter);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int count = adapter.getCount();
adapter.add(String.valueOf(count));
listview.setSelection(count);
}
});
}
}
これは「コミュニティwiki」であるため、自由に追加または改善してください。
下部にあるボタンでRelativeLayoutを使用してみてください。レイアウトの高さを「wrap_content」として設定します。試したことがありません。ただのアイデア
linearLayoutで、ListViewにAndroid:layout_weight="1"
を追加するだけです
以下は私のために働いたものです...
if(adapter.getCount() > 3){
View item = adapter.getView(0, null, impDateListView);
item.measure(0, 0);
LayoutParams params = impDateListView.getLayoutParams();
params.width = LayoutParams.MATCH_PARENT;
params.height = 3 * item.getMeasuredHeight();
impDateListView.setLayoutParams(params);
}
注:params.width = ...も設定する必要があります...
上記の例は、TableRowおよびListViewをTableRow内で使用する場合です...
コンテンツを線形レイアウトでラップする
リストビューで追加:Android:layout_weight = "1"
ボタンセットの固定高さ
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<ListView
Android:id="@+id/my_list"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight="1">
</ListView>
<Button
Android:text="Button"
Android:layout_width="match_parent"
Android:layout_height="50dp"/>
</LinearLayout>
要素がリストに追加されるときにリストビューの下のコンテンツを下に移動する場合は、次の解決策を試してください。
リストビューの下部に正のパディングを追加し、「フッター」の上部に負のパディングを追加します。これは、線形レイアウトまたは相対レイアウトで機能します。
<ListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="50dp"/>
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="-50dp"/>