В моем приложении у меня есть 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.