Как обновить / перекрасить TextView, созданный в Android Sceneform? - PullRequest
0 голосов
/ 28 февраля 2019

Мое намерение состоит в том, чтобы показывать динамические показания датчика с помощью TextView («информационная карта») в расширенном изображении приложения Android Sceneform.

В качестве основы я использую образец AugmentedImage SceneForm.Я скопировал концепцию информационной карты из примера Solarsystem и, наконец, (после нескольких трудных дней усилий) смог найти способ вывести TextView из лямбда-функции, чтобы я мог использовать setText в основной деятельности (довольно многовремя с моего предыдущего опыта java 1.2).Теперь я могу успешно установить TextText () для TextView (отлаженный с помощью getText ()) со значениями временной метки, но позже попытаюсь изменить его для получения значения через HTTP или MQTT.

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

В AugmentedImageActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
    fitToScanView = findViewById(R.id.image_view_fit_to_scan);

    LinearLayout mainLayout = (LinearLayout) findViewById(R.layout.activity_main);
    LayoutInflater inflater = getLayoutInflater();
    View infoCardLayout = inflater.inflate(R.layout.info_card_view, mainLayout, false);
    textView = (TextView) infoCardLayout.findViewById(R.id.textView);

    arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);
}

В AugmentedImageActivity:

private void onUpdateFrame(FrameTime frameTime) {
    Frame frame = arFragment.getArSceneView().getArFrame();
    Log.d("TW_onUpdateFrame","onUpdateFrame");
    String t = String.valueOf(System.currentTimeMillis());
    t = t.substring(t.length()-6);
    textView.setText(t);

В AugmentedImageNode.java в setImage:

  ...
  localPosition.set(0.0f, 0.0f, -0.8f * image.getExtentZ());
  infoCard = new Node();
  infoCard.setParent(this);
  infoCard.setEnabled(true);
  infoCard.setLocalPosition(localPosition);
  infoCard.setLocalRotation(new Quaternion(new Vector3(1.0f,0.0f,0.0f),-90));

  ViewRenderable.builder()
          .setView(context, R.layout.info_card_view)
          .build()
          .thenAccept(
                  (renderable) -> {
                      infoCard.setRenderable(renderable);
                      TextView textView = (TextView) renderable.getView();
                      textView.setText("Value from setImage");
                  })
          .exceptionally(
                  (throwable) -> {
                      throw new AssertionError("Could not load info card view.", throwable);
                  });

Как и где я могу перерисовать TextView информационной карты?Также принимая во внимание, что значения должны быть выбраны асинхронно по HTTP в будущем?Этот ViewRenderable.builder () с лямбда-функциями thenAccept заставляет меня плакать:)

1 Ответ

0 голосов
/ 03 марта 2019

Вы создаете представление дважды, надувая его в своем конструкторе, а затем заставляя конструктор ViewRenderable снова его раздувать.Тот, который вы сохранили, не тот, который фактически отображается.

Вы создаете ViewRenderable только один раз, поэтому обратный вызов для thenAccept вызывается только один раз.Вам нужно сохранить полученное представление в некоторой переменной в AugmentedImageNode, а затем предоставить его с помощью функции получения, чтобы вы могли получить его в AugmentedImageActivity.Затем вы должны вызвать setText в onUpdateFrame, как и раньше.

Также имейте в виду, что renderable.getView() дает вам представление макета, вам все равно нужно вызвать findViewById, чтобы получить textView.

...