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을 참조하십시오. 카메라와 다른 조각 사이를 완벽하게 스 와이핑 할 수 있습니다.

편집 :

그래서 나는 변경 내이에 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

확실히 해킹이긴하지만, 어떻게하는지 알아 냈습니다.

트릭은 안드로이드 작업 표시 줄을 사용하지 않는 것입니다, 그것은 당신의 레이아웃 파일에 자신의 있도록합니다.

<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의 안드로이드 상태 표시 줄에 패딩입니다 :

나는 내 코드에서 두 개 더 RelativeLayouts을 정의했다.25dip으로 설정했지만 다양 할 수도 있습니다.이 값을 프로그래밍 방식으로 설정하는 것이 가장 좋습니다. 또한 상태 막대 색상과 일치하도록 UI 색상을 검정색으로 설정해야 UI가 더욱 자연스럽게 보입니다.

하단 RelativeLayout은 가짜 작업 표시 줄입니다. 이 RelativeLayout에 작업 표시 줄에 필요한 모든 것을 채울 필요가 있습니다 (제목 텍스트, 버튼 등). 나는 이것을 48dip으로 설정했지만 다시 이것은 다양 할 것이므로 프로그래밍 방식으로 설정해야 할 것이다.

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

이제 우리는 상태 표시 줄 숨기기 및 표시 할 필요가 : 활동에서

당신의 조각을 호스팅, ViewPager와 FragmentPagerAdapter, 당신은 상태가 오버레이 바 만들기 위해 안드로이드를 알려주는 플래그를 설정해야 우리는 단편을 전환합니다. 당신의 활동이 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

먼저, 상태 표시 줄을 숨길 활동/조각에서 : 조각의 공용 static합니다. 당신의 onPageSelected에서 다음

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

는 :

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(); 
} 

을 나는이 방법으로 문제가 해결되기를 바랍니다. :)

관련 문제