旋转或烂卡视图后,Cardview阴影会重新绘制

时间:2016-12-10 19:53:38

标签: java android

我发现了CardView阴影的非常奇怪的行为。 我刚开始开发一个应用程序,并且绝对没有任何业务逻辑或类似的东西。但无论如何......

我只是为我的片段布局添加了一些视图,并发现,在每个屏幕旋转后,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>

Java (片段类中没有其他内容)

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.date_choose_fragment, container, false);
        return rootView;
    }

依赖关系

compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:cardview-v7:25.0.1'

Screenshots

1 个答案:

答案 0 :(得分:4)

这很可能不是由于CardView或其阴影抽奖的任何错误造成的。相反,这可能是多个Fragment s具有透明背景,一个堆叠在另一个上面,而变暗阴影是阴影的附加效果的结果。透光性。

Fragment时会自动重新创建活动Activity个实例,默认情况下会在更改方向时发生。如果您无条件地添加动态Fragment实例,例如,在Activity的{​​{1}}方法中,那么该实例将与从中重新创建的任何实例一起添加onCreate()的先前状态。实际上,每次旋转设备时,您都会向堆栈添加一个Activity,阴影会变得更暗。

只需简单Fragment就可以证明这一点,以表明它不是TextView特有的问题。

CardView

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" /> &#39; Activity方法中,我们添加了一个动态创建的onCreate(),其中包含给定的布局,如上所述。

Fragment

此图像显示旋转设备后的连续捕获,每个步骤两次。

screenshots

如果要在public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction() .add(android.R.id.content, new MainFragment()).commit(); } public static class MainFragment extends Fragment { public MainFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); } } } Fragment方法中打印日志,您会看到每次轮换时都会创建一个附加实例。在该序列的最后,我们有11个onCreateView()在玩。

阻止这种情况的一种方法是在创建和添加新Fragment之前检查Fragment是否已附加到FragmentManager,我们可以通过在{{1}中添加标记来执行此操作}。例如:

FragmentTransaction

或者,如果您不需要在启动后动态处理if (getFragmentManager().findFragmentByTag("main") == null) { getFragmentManager().beginTransaction() .add(android.R.id.content, new MainFragment(), "main").commit(); } ,则可以在布局中静态定义它,Fragment将处理检查和事务本身。

FragmentManager