web-dev-qa-db-ja.com

Android 5.0-ボタンの上にプログレスバーを表示することはできません

タイトルは私の問題をかなり明確に示していると思います...だから、これが私のレイアウトです:

_            <RelativeLayout
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content">

                <Button
                    Android:id="@+id/button_action"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:text="Login" />

                <ProgressBar
                    Android:id="@+id/progress_bar"
                    Android:layout_width="50dp"
                    Android:layout_height="50dp"
                    Android:layout_centerInParent="true"/>

            </RelativeLayout>
_

Android SDKs <21、問題ありません、ProgressBarはボタンの上に正しく表示され、ボタンの中央に配置されます。しかしAndroid 5.0では、ProgressBarが表示されます背後ボタン。

そのため、[開発者向けオプション]設定で[レイアウトの境界を表示]オプションをアクティブにすると、正しく配置されていることがわかりますが、そのオプションがないと画面には何も表示されません。

誰かがこれを修正する方法を知っていますか?最近導入されたelevationの問題だと思いますが、どうすればいいのかわかりません。参考までに、最近リリースされたsupport.v7のTheme.AppCompatスタイルを使用しています。

編集:

プログラムでsetElevation(0)setTranslationY(0)をボタンに適用しようとしましたが、何も変更されませんでした。標高に対応する必要があるのでしょうか。

みんなありがとう

マシュー

26
MathieuMaree

ProgressBarでAndroid:translationZ属性を使用できます。

        <ProgressBar
            Android:id="@+id/progress_bar"
            Android:layout_width="50dp"
            Android:layout_height="50dp"
            Android:translationZ="2dp"
            Android:layout_centerInParent="true"/>
53
wpiwonski

ここで同じ問題、私の単純な「ハック」は、ボタンを別のFrameLayoutにラップしすぎていました。この方法では、APIバージョンやその他の昇格の問題は気にしません;)

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center" >

        <FrameLayout
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">
                <Button
                    Android:id="@+id/button_action"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:text="Login" />
        </FrameLayout>

        <ProgressBar
            Android:id="@+id/progress_bar"
            Android:layout_width="50dp"
            Android:layout_height="50dp" />
</FrameLayout>
9
Tobliug

同じ質問がここで行われ、問題のより良い説明が付いています:

https://stackoverflow.com/a/27216368/23591

@CommonsWareを引用するには:

問題が表示されますAndroid 5.0のelevationプロパティ。どうやら、RelativeLayout Z軸の順序はelevationに関連付けられています。両方のウィジェットがelevationが同じ場合、RelativeLayoutがZ軸の順序を決定します。たとえば、レイアウトを両方のButtonウィジェットに切り替えると、次のようになります。ただし、1つのウィジェット(Button)にelevationがあり、別のウィジェット(ImageView)にない場合は、elevationが優先されます。

Buttonelevationは、Android:stateListAnimator="@null"または 独自のカスタムアニメーターを定義する によって削除できます。または、いくつかのelevationImageViewに追加して、ButtonよりもZ軸上で高くすることができます。

5
LambergaR

Build.gradleに「androidx.core:core」を追加すると、API <21にこのコードを使用できます。

ViewCompat.setTranslationZ(viewToElevate, 5);
0
sp00ky

Android:translationZを2 dp以上に設定することをお勧めします。ボタンを押すと、ビュー/ウィジェットが消えます。理由を説明しました ここ

<!-- Elevation when button is pressed -->
<dimen name="button_elevation_material">1dp</dimen>
<!-- Z translation to apply when button is pressed -->
<dimen name="button_pressed_z_material">2dp</dimen>

ボタンにはこれら2つの値があり、 フレームワーク で定義されています。

0
zzas11