2013-07-20 45 views
13

我有一個ViewPager和FragmentPagerAdapter在一個活動中設置了3個片段。所有碎片,同時加載並使用通過編程以全屏模式生成片段

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

我想出瞭如何做到這一點,雖然它絕對是一個黑客。

訣竅是不使用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,但可能會有所不同 - 最好以編程方式設置此值。您還需要將其設置爲黑色,以便它與狀態欄顏色相匹配,並使UI看起來更自然。

底部的RelativeLayout適用於你的假動作條。您需要在此RelativeLayout中填充您的操作欄所需的所有內容(標題文本,按鈕等)。我將它設置爲48dip,但是這又會有所不同,您可能應該以編程方式進行設置。

在活動舉辦的片段,ViewPager和FragmentPagerAdapter,你需要設置的標誌,告訴安卓使狀態欄的疊加:

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

我希望這能解決你的問題。 :)