在我的应用中,我有一个TextView
和一个ImageView
,我会根据传感器信息进行更新。这在模拟器和我尝试过的大多数手机上都可以完美运行,但是由于某些原因,在从S7到S9的三星手机上,它们都没有变化,因此它们应该进行更新。
它们是片段的一部分,它覆盖了其中包含照相机预览的SurfaceView,在它们上面还有第二个SurfaceView覆盖:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="myApp.CameraViewFragment">
<FrameLayout
android:id="@+id/control"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<myApp.CameraSurfaceView
android:id="@+id/camera_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
<TextView
android:id="@+id/direction"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:background="@color/black_overlay"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:textSize="30dp"
android:text="" />
<ImageButton
android:id="@+id/gpsNotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gps_unfixed"
android:layout_gravity="right"
android:tint="@color/gps_unfixed"
android:background="@null" />
</FrameLayout>
<com.myapp.OverlaySurfaceView
android:id="@+id/overlay_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:gravity="center"
android:layout_gravity="center_horizontal|center_vertical"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</FrameLayout>
据我所知,这是片段代码的相关部分:
public class CameraViewFragment extends Fragment
{
private TextView directionView;
private CameraSurfaceView cameraView;
private OverlaySurfaceView overlay;
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
cameraView = (CameraSurfaceView) view.findViewById(R.id.camera);
directionView = (TextView) view.findViewById(R.id.direction);
overlay = (OverlaySurfaceview) view.findViewById(R.id.overlay_view);
}
private void setDirection(AccurateDirection direction) {
final String directionString = direction.getDirection();
overlay.update();
Activity activity = getActivity();
if ( activity != null ) {
activity.runOnUiThread(new Runnable() {
public void run() {
directionView.setText(directionString);
directionView.invalidate();
}
});
}
}
}
当我在常规手机上运行此命令时,directionView
文本会随着新方向数据的到达而更新。在Samsung S7上,该值设置一次,也许一开始就更新一次,然后似乎是[[stick并且不再更改。如果我在调试器中暂停并从立即窗口调用directionView.getText()
,它会给我期望的结果,不是我在屏幕上看到的结果。如果在立即窗口中调用directionView.setText('ABC')
,则该值directionView.getText()
返回的值更改,但屏幕上的值再次更改。无论应该进行哪些更改,ImageView似乎都停留在其初始状态。
invalidate
,所以我已经修复了这两个问题,但问题仍然存在。我只在最近的三星手机上看到了这一点(我的旧三星S4似乎还不错),这很难进行故障排除。为什么我的视图组件在Samsung设备上没有更改,我该怎么做才能更新它们?
编辑:道歉,因为我省略了OverlaySurfaceView
,因此以前任何人都试图回答这个问题,现在我意识到,如果删除了OverlaySurfaceView
,其他组件也会正确更新,因此显然在视图层次结构中有第二个SurfaceView
正在干扰,但仅限于三星。开启和关闭硬件加速似乎没有什么不同,但是可能需要特定的位置或方式。在工作的手持机上,OverlaySurfaceView的硬件加速标记为禁用。