Java 旋转或旋转后,Cardview阴影会重新绘制自身
我发现了卡德维尤阴影的奇怪行为。 我刚开始开发一个应用程序,绝对没有任何商业逻辑或类似的东西。但无论如何 我只是在片段布局中添加了一些视图,发现每次屏幕旋转后,cardview的阴影都会变暗旋转5-6圈后它看起来已经是完全黑色了。我想,问题可能在画布的某个地方,但不知道在哪里,为什么——我甚至没有开始定制任何东西。 我希望有人已经用cardview解决了类似的问题,现在可以分享这一经验 谢谢大家! 以下是屏幕截图、代码、依赖项和xml: XMLJava 旋转或旋转后,Cardview阴影会重新绘制自身,java,android,Java,Android,我发现了卡德维尤阴影的奇怪行为。 我刚开始开发一个应用程序,绝对没有任何商业逻辑或类似的东西。但无论如何 我只是在片段布局中添加了一些视图,发现每次屏幕旋转后,cardview的阴影都会变暗旋转5-6圈后它看起来已经是完全黑色了。我想,问题可能在画布的某个地方,但不知道在哪里,为什么——我甚至没有开始定制任何东西。 我希望有人已经用cardview解决了类似的问题,现在可以分享这一经验 谢谢大家! 以下是屏幕截图、代码、依赖项和xml: XML <?xml version="1.0" en
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:iot="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/common_gap"
iot:cardElevation="10dp"
iot:cardUseCompatPadding="true">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/common_gap"
android:calendarViewShown="true"
android:spinnersShown="false" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/common_gap"
android:paddingRight="@dimen/common_gap"
android:text="@string/choose_date_confirm_button"
android:textColor="@color/colorPrimary" />
</LinearLayout>
</ScrollView>
</android.support.v7.widget.CardView>
</LinearLayout>
依赖关系
compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:cardview-v7:25.0.1'
这很可能不是由于
CardView
或其阴影绘制的任何缺陷造成的。相反,这很可能是多个透明背景的片段
叠加的结果,而变暗的阴影是阴影半透明性的叠加效果
当活动
处于活动状态时,会自动重新创建活动片段
实例,默认情况下,在方向更改时会发生这种情况。如果无条件地添加动态片段
实例,例如,在活动
的onCreate()
方法中,该片段将与从活动
先前状态重新创建的任何实例一起添加。实际上,每次旋转设备时,都会向堆栈中添加一个片段
,阴影会变暗一点
这可以通过一个简单的TextView
来演示,以表明这不是cardwiew
特有的问题
fragment.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Hello world!"
android:textSize="60sp"
android:textStyle="bold"
android:textColor="#fffbc02d"
android:shadowColor="#70707070"
android:shadowDx="10"
android:shadowDy="10"
android:shadowRadius="10" />
此图显示旋转设备后的连续捕获,每个步骤两次
如果要在Fragment
的onCreateView()
方法中添加日志打印,您将看到在每次旋转时都会创建一个额外的实例。在这个序列的末尾,我们有11个Fragment
s在起作用
防止这种情况的一种方法是,在创建和添加新的片段管理器之前,检查片段
是否已附加到片段管理器
,我们可以通过在片段事务
中添加标记来实现。例如:
if (getFragmentManager().findFragmentByTag("main") == null) {
getFragmentManager().beginTransaction()
.add(android.R.id.content, new MainFragment(), "main").commit();
}
或者,如果启动后不需要动态处理片段
,则可以在布局中静态定义它,而片段管理器
将处理检查和事务本身
<fragment
android:id="@+id/main_fragment"
android:name="com.mycompany.myapp.MainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
你完全正确!我创建了一堆片段,我忘了检查,当前片段是否已经附加。非常感谢您的详细回答和很好的解释
if (getFragmentManager().findFragmentByTag("main") == null) {
getFragmentManager().beginTransaction()
.add(android.R.id.content, new MainFragment(), "main").commit();
}
<fragment
android:id="@+id/main_fragment"
android:name="com.mycompany.myapp.MainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />