在我的应用程序中,我有一个 TextView
和 ImageView
我根据传感器信息更新。这在模拟器和我尝试过的大多数手机上都能完美运行,但是在从 S7 到 S9 的三星手机上,由于某种原因,它们都不会在应该更新时发生变化。
它们是覆盖带有相机预览的 SurfaceView 的 Fragment 的一部分,它们上方还有第二个 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>
据我所知,这是 fragment 代码的相关部分:
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
文本随着新方向数据的到来而更新。在三星 S7 上,该值设置一次,可能在一开始就更新一次,然后它似乎会粘住,不再改变。如果我在调试器中暂停并调用 directionView.getText()
从即时窗口中,它给了我我期望的结果,而不是我在屏幕上看到的结果。如果我调用 directionView.setText('ABC')
在即时窗口中,directionView.getText()
返回的值更改,但屏幕上的值再次没有。 ImageView 似乎也停留在其初始状态,不管应该调整它的变化。以前关于此主题的问题似乎涉及未从 UI 线程触发的更新或未能调用
invalidate
在 View 组件上,所以我已经修复了这两个,但问题仍然存在。我只在最近的三星手机上看到过这种情况(我的旧三星 S4 似乎很好),这使得故障排除变得困难。为什么我的 View 组件在三星设备上没有改变,我需要做什么来更新它们?
编辑:向以前试图回答这个问题的任何人道歉,因为我省略了
OverlaySurfaceView
我现在意识到如果 OverlaySurfaceView
其他组件会正确更新被删除,所以显然有第二个 SurfaceView
在 View 层次结构中存在干扰,但仅限于三星。打开和关闭硬件加速似乎没有什么区别,但可能有一个特定的地方或方式我需要这样做。在工作手机上,“OverlaySurfaceView”将硬件加速标记为禁用。
最佳答案
我在三星 S7 设备上遇到了同样的问题,
最终我意识到我没有正确处理 setZOrderOnTop
看看这个答案:
Button on top of SurfaceView with setZOrderOnTop set to true in Android
关于Android TextView.setText() 在最近的带有 SurfaceView 覆盖的三星手机上没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072334/