I think the title is pretty explicit about my problem... So here is my layout :
Same question being asked here, with a better explanation of the issue:
https://stackoverflow.com/a/27216368/235910
To quote @CommonsWare:
The problem appears Android 5.0's
elevationproperty. Apparently, theRelativeLayoutZ-axis ordering is tied intoelevation. If both widgets have the sameelevation, theRelativeLayoutwill determine the Z-axis order -- you can see that if you were to switch your layout to be bothButtonwidgets, for example. However, if one widget (Button) has anelevation, and another widget (ImageView) does not, theelevationwill take precedence.You can remove the
Buttonelevationviaandroid:stateListAnimator="@null"or by defining your own custom animator. Or, you can add someelevationto yourImageViewto get it to be higher on the Z axis than is theButton.
It is better to set android:translationZ more than 2dp. Your view/widget will disappear when you press the button. I explained the reason here.
<!-- 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>
Button have these two values and defined in the framework.
If you add 'androidx.core:core' to your build.gradle, you can use this code for API < 21:
ViewCompat.setTranslationZ(viewToElevate, 5);
Probably the simplest way is to use the FrameLayout since it was created to make layouts whose child views are ordered by z-index:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
<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" />
</FrameLayout>
I'm not sure what does your layout look like, so maybe you'll need to play with android:layout_gravity.
Same issue here, my simple "hack" was too wrap the Button into another FrameLayout. This way I don't care about the api version and other elevation issue ;)
<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>
You can add the android:translationZ attribute to the ProgressBar:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="50dp"
android:layout_height="50dp"
android:translationZ="2dp"
android:layout_centerInParent="true"/>