我发现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(片段类中没有其他内容)
@OverrIDepublic 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
解决方法:
这很可能不是由于CardVIEw的任何错误或其阴影绘制.相反,这可能是由于多个具有透明背景的片段相互堆叠在一起的结果,而变暗的阴影是阴影半透明的累加效果.
“活动”处于活动状态时会自动重新创建“活动片段”实例,默认情况下会在方向更改时发生.例如,如果您无条件添加动态Fragment实例,则在Activity的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" />
如上所述,在示例Activity的onCreate()方法中,我们使用给定的布局添加了动态创建的Fragment.
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的onCreateVIEw()方法中,则会看到每次旋转都会创建一个附加实例.在该序列的结尾,我们正在播放11个片段.
一种防止这种情况的方法是,在创建和添加新片段之前检查Fragment是否已经连接到FragmentManager,我们可以通过在FragmentTransaction中添加标签来做到这一点.例如:
if (getFragmentManager().findFragmentByTag("main") == null) { getFragmentManager().beginTransaction() .add(androID.R.ID.content, new MainFragment(), "main").commit();}
另外,如果您不需要在启动后动态处理Fragment,则可以在布局中静态定义它,然后FragmentManager将自行处理检查和事务.
<fragment androID:ID="@+ID/main_fragment" androID:name="com.mycompany.myapp.MainFragment" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" />
总结 以上是内存溢出为你收集整理的java-Cardview阴影在旋转或烂Cardview之后会重绘自身全部内容,希望文章能够帮你解决java-Cardview阴影在旋转或烂Cardview之后会重绘自身所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)