2013-07-20 3 views
13

У меня есть ViewPager и FragmentPagerAdapter, созданный в одном действии с тремя фрагментами. Все фрагменты загружаются одновременно и хранятся в памяти с помощьюСделать фрагменты на весь экран программно

mPager.setOffscreenPageLimit(2); 

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

Как я могу сделать только фрагмент предварительного просмотра камеры во весь экран, сохранив при этом два других фрагмента? Я пробовал использовать темы, что означает разрыв панели действий.

Программным вызова следующее не помогает, потому что она заставляет всю деятельность, чтобы быть полный экран (и, таким образом, остальные два фрагмента вместе с ним):

requestWindowFeature(Window.FEATURE_NO_TITLE); 
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
setContentView(R.layout.main); 

Я также попытался реализации ViewPager.OnPageChangeListener:

public void onPageSelected(int position) { 
    if(position == 1) 
     getActionBar().hide(); 
    else 
     getActionBar().show(); 
} 

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

Для примера того, что я хочу сделать точно, см. Snapchat - им удастся полностью очистить прокрутку между камерой и другими фрагментами.

Edit:

Так что я изменил мой onPageSelected к этому:

public void onPageSelected(int position) { 
    if(position == 1) { 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } else { 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } 
} 

Это позволяет мне изменить, отображается ли в строке состояния или нет. Тем не менее, это вызывает большое количество битков. Такая же проблема с панелью действий.

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

ответ

11

Я понял, как это сделать, хотя это определенно взломать.

Хитрость заключается не в использовании панели действий Android, а в собственных файлах макетов.

я определил еще два RelativeLayouts в моем коде:

<RelativeLayout 
    android:id="@+id/padding" 
    android:layout_width="fill_parent" 
    android:layout_height="25dip" 
    android:layout_alignParentTop="true" 
    android:background="@color/abs__background_holo_dark" /> 

<RelativeLayout 
    android:id="@+id/fake_action_bar" 
    android:layout_width="fill_parent" 
    android:layout_height="48.0dip" 
    android:layout_below="@id/padding" > 

<!-- stuff here --> 

</RelativeLayout> 

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

Нижняя RelativeLayout предназначена для вашей поддельной панели действий. Вам нужно заполнить все, что нужно вашему бару (текст заголовка, кнопки и т. Д.) В этом RelativeLayout. Я установил его на 48dip, но опять же, это будет отличаться, и вы должны, вероятно, установить его программным путем.

В деятельности, на котором размещены фрагменты, ViewPager и FragmentPagerAdapter, вам необходимо установить флаги говоря Android, чтобы сделать статус бар накладку:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

Теперь нам нужно сделать строку состояния шкурку и шоу, когда мы переключаем фрагменты. Был ли ваша деятельность осуществлять ViewPager.OnPageChangeListener, а затем использовать следующий код:

@Override 
public void onPageScrollStateChanged(int state) { 
    switch(state) { 
    case ViewPager.SCROLL_STATE_IDLE: 
     if(mPosition == 1) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } else { 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } 
    } 
} 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

} 

@Override 
public void onPageSelected(int position) { 
    mPosition = position; 
} 

Мы отслеживаем номер страницы с помощью onPageSelected и использовать его в onPageScrollStateChanged динамически скрыть/показать строку состояния в зависимости от которой фрагмент в настоящее время отображается. Вы не можете сделать это в onPageSelected, потому что это приведет к тому, что строка состояния будет отображаться наполовину через салфетки.

Вам также нужно обязательно добавить соответствующий код для вашей поддельной панели действий - для кнопок это будет OnClickListener.

2

Во-первых, в действии/фрагменте вы хотите скрыть строку состояния: Сделать публичный статический фрагмент.

public static Fragment QSFrag; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    QSFrag = this; 
} 

Затем в onPageSelected:

public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     if(position == 1){ 
      mActionBar.hide();    


      YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     }else{ 

      mActionBar.show(); 
      // mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it. 
     } 

    } 

Я просто проверял, и это работает. Но это не выглядит потрясающе, когда вы оставляете фрагмент без статуса-бара. : p

+0

Я попробовал модифицированную версию этого, что помогает устранить строку состояния, но она отстает от сумасшедшего –

+0

Кроме того, я просто понял, что это может вызвать сбои приложений, если фрагмент был выгружен из памяти из-за страницы салфетки или если они когда-либо были уничтожены и воссозданы, например, от изменения ориентации. Вам нужно будет получить ссылку на фрагмент с помощью findFragmentById(), так как старая ссылка будет недействительной –

+0

что такое 'mActionBar'? –

0

Вы можете использовать этот код в onCreate:

setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
if (getSupportActionBar() != null) { 
    getSupportActionBar().hide(); 
} 

Я надеюсь, что это решит вашу проблему. :)

Смежные вопросы