web-dev-qa-db-ja.com

FrameLayoutのボタンは常に上部に表示されます

私はこのような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クラスの概要が「子ビューはスタックに描画され、最後に追加された子が上に表示される」ことです。

34
Nokuap

この回答

Lollipop以降のボタンにはデフォルトの標高があり、常に上に描画されます。これを変更するには、デフォルトのStateListAnimatorをオーバーライドします。

これをボタンXMLに入れてみてください。

Android:stateListAnimator="@null"

これで、FrameLayoutがボタンを覆うはずです。

60
Rahul Tiwari

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"/>
13
Kyle Vo

公式Android documantationが指摘しているように:

FrameLayoutは、画面上の領域をブロックするように設計されています単一のアイテムを表示するために子が互いに重なり合うことなく、さまざまな画面サイズにスケーラブルです。ただし、複数の子をFrameLayoutに追加し、Android:layout_gravity属性を使用して各子に重力を割り当てることにより、FrameLayout内の位置を制御できます。

Button内のTextview内にRelativeLayoutFrameLayoutを入れると良いでしょう:

<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>
2
zkminusck

どうやら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>
1
Hawk Red

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>
1
Thoms

ButtonFrameLayoutの中に入れます

<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>
1
Anril

FrameLayout を使用してsingle child view。これは、子なしでさまざまな画面サイズにスケーラブルな方法で子ビューを編成するのが難しい場合があるためですお互いに重なり合う

LinearLayoutまたはRelativeLayoutFrameLayoutで使用する必要があります。このように

<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>
1
IntelliJ Amiya