[Android TextView.setText()在最近的带有SurfaceView叠加层的三星手机上没有更改

问题描述 投票:4回答:1

在我的应用中,我有一个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似乎都停留在其初始状态。

关于此主题的先前问题似乎涉及未从UI线程触发更新或未能在视图组件上调用invalidate,所以我已经修复了这两个问题,但问题仍然存在。

我只在最近的三星手机上看到了这一点(我的旧三星S4似乎还不错),这很难进行故障排除。为什么我的视图组件在Samsung设备上没有更改,我该怎么做才能更新它们?

编辑:道歉,因为我省略了OverlaySurfaceView,因此以前任何人都试图回答这个问题,现在我意识到,如果删除了OverlaySurfaceView,其他组件也会正确更新,因此显然在视图层次结构中有第二个SurfaceView正在干扰,但仅限于三星。开启和关闭硬件加速似乎没有什么不同,但是可能需要特定的位置或方式。在工作的手持机上,OverlaySurfaceView的硬件加速标记为禁用。

android textview surfaceview samsung-mobile
1个回答
1
投票
我在三星S7设备上遇到了同样的问题,最终我意识到我没有正确处理setZOrderOnTop
© www.soinside.com 2019 - 2024. All rights reserved.