Android TextView.setText() 在最近的带有 SurfaceView 覆盖的三星手机上没有改变

标签 android textview surfaceview samsung-mobile

在我的应用程序中,我有一个 TextViewImageView我根据传感器信息更新。这在模拟器和我尝试过的大多数手机上都能完美运行,但是在从 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/

相关文章:

android - 无法使用其最新版本为 Android 构建 Cordova 项目

java - 在textview Android中显示秒数倒计时

android - 使用 Robotium 关闭互联网连接

android - 如何使用 "group by"选项从 MEDIA 提供商查询?

android - 如何使textview在android中的按钮点击事件中可见

android - 以编程方式在 framelayout 中的 imageview 上覆盖文本 - Android

Android SurfaceView Canvas 用线程绘制

java - 如何导航回来并恢复我的应用程序而不挂起它?

android - 如何在android中编写滚动游戏相机?

android - 删除固定数量的数字