Невозможно сделать полноэкранную презентацию Android на втором экране

Мой вопрос касается возможности Android для использования дополнительного экрана устройства, т.е. android.app.Presentation

Я использую эту оболочку: https://github.com/commonsguy/cwac-presentation

К сожалению, я не могу заставить второй экран быть в полноэкранном режиме: хотя его ширина полностью соответствует экрану, его высота всегда ограничена полосой в центре экрана, примерно 1/4 высоты экрана.

Соответственно, все его содержимое отображается в этих узких границах, а остальные части экрана остаются черными и бесполезными.

Для тех, кто не имеет представления об этом API,
android.app.Presentation – это особый тип Dialog, который отображается на дополнительном экране устройства.
Оболочка, о которой я упоминал выше, основана на PresentationFragment, которая расширяет DialogFragment. . Пользователь создает класс, расширяющий PresentationFragment, и в его переопределенном onCreateView() создает макет, который он хочет отображать на втором экране. Пример:

    public class CustomPresentationFragment extends PresentationFragment {

        public static CustomPresentationFragment newInstance(Context ctxt,
                                                             Display display) {

        CustomPresentationFragment frag=new CustomPresentationFragment();

        frag.setDisplay(ctxt, display);

        //we may prepare bundle to pass, if necessary
        //Bundle b=new Bundle();
        //b.putString("key1", value1);
        //b.putString("key2", value2);
        //frag.setArguments(b); 

        return(frag);
        }



      @Override
      public View onCreateView(LayoutInflater inflater,
                               ViewGroup container,
                               Bundle savedInstanceState) {

      View myView = new View(getContext());       

      //here we create layout that we want to be displayed on second screen, and return it

      return(myView);

      }


}

Это реализация PresentationFragment. Как мы видим, он содержит переменную Presentation:

package com.commonsware.cwac.preso;

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Presentation;
import android.content.Context;
import android.os.Bundle;
import android.view.Display;

public abstract class PresentationFragment extends DialogFragment
 {
   private Display display = null;
   private Presentation preso = null;

   public Dialog onCreateDialog(Bundle savedInstanceState)
   {
     if (this.preso == null) {
       return super.onCreateDialog(savedInstanceState); 

       //instead of simply returning super value, I have tried the following here,
       //with no success:
       //
       //Dialog dlg = super.onCreateDialog(savedInstanceState);
       //dlg.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
       //dlg.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
       //dlg.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
       //return dlg;

    }

     return this.preso;
   }

   public void setDisplay(Context ctxt, Display display) {
     if (display == null) {
       this.preso = null;
     }
     else {
       this.preso = new Presentation(ctxt, display, getTheme());

       //since Presentation is Dialog, I have tried the same here as well,
       //no success:

       //this.preso.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
       //this.preso.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
       //this.preso.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);


     }

     this.display = display;
   }

   public Display getDisplay() {
     return this.display;
   }

   protected Context getContext() {
     if (this.preso != null) {
       return this.preso.getContext();
     }

     return getActivity();
   }
}

РЕДАКТИРОВАТЬ. Это onCreateView() из одного из моих PresentationFragments:

@Override
      public View onCreateView(LayoutInflater inflater,
                               ViewGroup container,
                               Bundle savedInstanceState) {

      String uri = "somefilepath";
      File imgFile = new  File(uri);
      Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

      ImageView view = new ImageView(getContext());
      view.setImageBitmap(myBitmap);
      view.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

      RelativeLayout pRelative = new RelativeLayout(getContext());   
      pRelative.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
      pRelative.setGravity(Gravity.CENTER);

      pRelative.addView(view);

      return pRelative;       

      }

person mangusta    schedule 16.12.2014    source источник
comment
Поскольку вы решили не показывать код, который вызывает у вас затруднения (т. е. реальную реализацию onCreateView()), я ничем не могу вам помочь. Попробуйте запустить прилагаемое демонстрационное приложение, которое не демонстрирует описанного вами поведения. Если вы получаете такое же поведение, что-то должно быть не так с вашей конкретной средой. Если демонстрационное приложение ведет себя правильно, сравните свою реализацию с демонстрационной.   -  person CommonsWare    schedule 16.12.2014
comment
@CommonsWare Спасибо за быстрый ответ. По сути, не имеет значения, какое представление я возвращаю из onCreateView(), один фрагмент возвращает RelativeLayout с ImageView внутри, второй фрагмент возвращает RelativeLayout с WebView внутри, третий фрагмент возвращает RelativeLayout с VideoView внутри. Все соответствует тому, как вы описали, как использовать onCreateView()   -  person mangusta    schedule 16.12.2014
comment
и все они ограничены узкой полосой посередине экрана. Что касается демонстрации, следует ли мне использовать ту, что помечена как демо, или ту, что называется презентацией?   -  person mangusta    schedule 16.12.2014
comment
По сути, не имеет значения, какое представление я возвращаю из onCreateView() -- да, имеет, потому что мы не можем видеть этот код и, следовательно, не можем помочь вам с ним или использовать его, чтобы попытаться воспроизвести ваш проблема. Что касается демонстрации, следует ли мне использовать ту, что помечена как демо, или ту, что называется презентацией? -- цитируя документацию. В демо/подпроекте вы найдете образец проект, демонстрирующий использование вышеупомянутых классов, за исключением PresentationService.   -  person CommonsWare    schedule 16.12.2014
comment
@CommonsWare хорошо, я включил ту, что с ImageView.   -  person mangusta    schedule 16.12.2014


Ответы (1)


Во-первых, родитель вашего RelativeLayout, вероятно, не является другим RelativeLayout, и поэтому вам не следует пытаться установить LayoutParams RelativeLayout как экземпляр RelativeLayout.LayoutParams.

Во-вторых, перепишите это как макет XML и раздуйте его. Тогда у вашего RelativeLayout больше шансов работать, так как он будет знать своего родителя во время инфляции. RelativeLayout привередливый зверь. Другим вариантом было бы переключиться с RelativeLayout на что-то другое, что может сделать ваше центрирование, например FrameLayout.

person CommonsWare    schedule 16.12.2014
comment
к сожалению, ваше демонстрационное приложение показывает такое же поведение. s50.radikal.ru/i130/1412/c6/4af7de26f918.jpg (размер второго экрана идентичен основному экрану). однако зеркало отображается нормально, т. е. поведение связано только с презентацией - person mangusta; 17.12.2014
comment
ссылка выше изображает экран при запуске приложения. это Зеркальная презентация, выбранная из меню: s017.radikal.ru/i427/1412 /80/c838f6c886de.jpg, а это фрагмент зеркала, выбранный из меню: i067.radikal.ru/1412/b5/44af1068614b.jpg - person mangusta; 17.12.2014
comment
@mangusta: он должен быть как-то привязан к вашему внешнему дисплею. Я без проблем использовал этот код на нескольких проекторах и телевизорах, в том числе для нескольких презентаций на конференциях. Что именно вы используете для внешнего дисплея? - person CommonsWare; 17.12.2014
comment
кажется, это было как-то связано с невозможностью второго экрана отображать полноэкранный режим в портретном режиме, поэтому мы переключили его на альбомный и повернули виды на 270 градусов по часовой стрелке. Это, похоже, решило проблему с полноэкранным режимом, хотя и привело к некоторым другим проблемам:) мы не можем масштабировать представления внутри фрагмента презентации. хотя это кажется немного не в тему, может быть вы знаете, как это побороть? :) - person mangusta; 17.12.2014
comment
@mangusta: я не уверен, что вы имеете в виду под масштабом. Вы имеете в виду setScaleX() и тому подобное? Я никогда не пробовал это в Presentation, но я был бы несколько удивлен, если бы это не сработало. - person CommonsWare; 17.12.2014
comment
да, setScaleX() и setScaleY(). спасибо за помощь, в любом случае :) - person mangusta; 17.12.2014
comment
@mangusta: Если вы придумаете воспроизводимый тестовый пример, демонстрирующий вашу проблему с масштабом, мне было бы интересно на это посмотреть. - person CommonsWare; 17.12.2014