Android TextView.setText () не меняется на последних телефонах Samsung с SurfaceView Overlay - PullRequest
0 голосов
/ 28 июня 2018

В моем приложении у меня есть TextView и ImageView, которые я обновляю на основе информации о датчике. Это прекрасно работает на эмуляторах и на большинстве телефонов, на которых я его пробовал, однако на телефонах Samsung от 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 значение устанавливается один раз, может быть, обновляется один раз в самом начале, а затем кажется, что придерживается и больше не меняется. Если я сделаю паузу в отладчике и вызову directionView.getText() из непосредственного окна, это даст мне ожидаемый результат, не то, что я вижу на экране. Если я вызываю directionView.setText('ABC') в непосредственном окне, значение, возвращаемое directionView.getText(), изменяется, но снова значение на экране не изменяется. ImageView также, кажется, застревает в своем начальном состоянии независимо от изменений, которые должны его корректировать.

Предыдущие вопросы по этой теме, по-видимому, включают обновления, не запускаемые из потока пользовательского интерфейса, или сбои при вызове invalidate в компоненте представления, поэтому я уже исправил оба из них, но проблема сохраняется.

Я видел это только на последних телефонах Samsung (мой старый Samsung S4 выглядит нормально), что затрудняет поиск и устранение неисправностей. Почему компоненты моего вида не меняются на устройствах Samsung и что мне нужно сделать, чтобы обновить их?

Редактировать: Извинения всем, кто ранее пытался ответить на этот вопрос, так как я пропустил OverlaySurfaceView, и теперь я понимаю, что другие компоненты обновляются правильно, если OverlaySurfaceView удален, поэтому очевидно, что вторая SurfaceView в представлении иерархия мешает, но только на самсунг. Включение и выключение аппаратного ускорения, кажется, не имеет значения, но может быть определенное место или способ, которым я должен сделать это. На работающем телефоне аппаратное ускорение помечено как отключенное для OverlaySurfaceView.

...