私はこのようなFrameLayoutを持っています:
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="changeColor"
Android:text="new button"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text"/>
</FrameLayout>
問題は、ボタンが一番上に表示され、FrameLayoutクラスの概要が「子ビューはスタックに描画され、最後に追加された子が上に表示される」ことです。
Lollipop以降のボタンにはデフォルトの標高があり、常に上に描画されます。これを変更するには、デフォルトのStateListAnimatorをオーバーライドします。
これをボタンXMLに入れてみてください。
Android:stateListAnimator="@null"
これで、FrameLayoutがボタンを覆うはずです。
Android 5.0(API 21)以降では、ビューにAndroid:elevationを追加する必要があります。
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="changeColor"
Android:text="new button"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text"
Android:elevation="3dp"/>
公式Android documantationが指摘しているように:
FrameLayoutは、画面上の領域をブロックするように設計されています単一のアイテムを表示するために子が互いに重なり合うことなく、さまざまな画面サイズにスケーラブルです。ただし、複数の子をFrameLayoutに追加し、Android:layout_gravity属性を使用して各子に重力を割り当てることにより、FrameLayout内の位置を制御できます。
Button
内のTextview
内にRelativeLayout
とFrameLayout
を入れると良いでしょう:
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text"/>
<Button
Android:id="@+id/button1"
Android:layout_below="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="changeColor"
Android:text="new button"/>
<RelativeLayout>
</FrameLayout>
どうやらAndroid:stateListAnimator = "@ null"はAPI = 21以上でのみ動作します。したがって、API <21をターゲットとする人はこれを使用して、私のために動作しました:D
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="changeColor"
Android:text="new button"/>
</FrameLayout>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text"/>
</FrameLayout>
API <21の場合、Android:stateListAnimator = "@ null"を使用したり、標高を変更したりすることはできません。私の場合、制約レイアウトに埋め込まれた2つのフレームレイアウトを使用しました。フレームレイアウトは互いに積み重ねることができるため、textviewの標高を変更する必要はありません。
<Android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:layout_width="0dp"
Android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
>
<Button
Android:id="@+id/my_daybutton"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/cal_button_background"
Android:textColor="@color/colorPrimaryDark"
Android:gravity="start|top"
Android:paddingTop="2dp"
Android:paddingStart="2dp"
Android:paddingEnd="2dp"
/>
</FrameLayout>
<FrameLayout
Android:layout_width="0dp"
Android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="bla"
Android:textSize="9sp"
Android:textColor="@Android:color/holo_red_dark"
Android:layout_gravity="bottom|end"
/>
</FrameLayout>
Button
をFrameLayout
の中に入れます
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="new button" />
</FrameLayout>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text" />
</RelativeLayout>
FrameLayout を使用してsingle child view
。これは、子なしでさまざまな画面サイズにスケーラブルな方法で子ビューを編成するのが難しい場合があるためですお互いに重なり合う。
LinearLayoutまたはRelativeLayoutをFrameLayoutで使用する必要があります。このように
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="changeColor"
Android:text="new button"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="some text"/>
</RelativeLayout>
</FrameLayout>