Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旋转或旋转后,Cardview阴影会重新绘制自身_Java_Android - Fatal编程技术网

Java 旋转或旋转后,Cardview阴影会重新绘制自身

Java 旋转或旋转后,Cardview阴影会重新绘制自身,java,android,Java,Android,我发现了卡德维尤阴影的奇怪行为。 我刚开始开发一个应用程序,绝对没有任何商业逻辑或类似的东西。但无论如何 我只是在片段布局中添加了一些视图,发现每次屏幕旋转后,cardview的阴影都会变暗旋转5-6圈后它看起来已经是完全黑色了。我想,问题可能在画布的某个地方,但不知道在哪里,为什么——我甚至没有开始定制任何东西。 我希望有人已经用cardview解决了类似的问题,现在可以分享这一经验 谢谢大家! 以下是屏幕截图、代码、依赖项和xml: XML <?xml version="1.0" en

我发现了卡德维尤阴影的奇怪行为。 我刚开始开发一个应用程序,绝对没有任何商业逻辑或类似的东西。但无论如何

我只是在片段布局中添加了一些视图,发现每次屏幕旋转后,cardview的阴影都会变暗旋转5-6圈后它看起来已经是完全黑色了。我想,问题可能在画布的某个地方,但不知道在哪里,为什么——我甚至没有开始定制任何东西。 我希望有人已经用cardview解决了类似的问题,现在可以分享这一经验

谢谢大家!

以下是屏幕截图、代码、依赖项和xml:

XML

<?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" />