2011-10-25 77 views
18

windowIsFloating而一個偉大的一站式創建Dialog風格的用戶界面有很多 ---錯誤---怪癖。如何創建一個無窗口透明活動是否浮動

其中我對抗右現在的之一是它分配的頂部祖先的寬度/高度爲"wrap_content「,而不是在屏幕的寬度/高度。這意味着使用"match_parents"將向上傳播完成的通常的用戶界面設計。成爲"wrap_content"不好的時候

所以,我真的想是創建一個活動,並有像這樣的佈局:

<LinearLayout android:layout_height="wrap_content" 
       android:layout_width="match_parent" 
       android:orientation="vertical" 
       android:id="@+id/containerPageConatiner" 
       android:background="@drawable/windowBackground"> 
    <View   android:layout_width="match_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1"/> 
    <FrameLayout android:id="@+id/singlePane" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:layout_gravity="center_horizontal|center_vertical" 
        android:padding="10dp"/>  
    <View   android:layout_width="match_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1"/>       
</LinearLayout> 

將會產生出一個單一窗口的UI(@ ID/singlePane)在它的Activity的ontop上調用它。

有沒有人有恰到好處創建透明背景所需的一組樣式Activity?

回答

29

感謝@PolamReddy誰捅了我對答案,我想:

主題Theme.Translucent.NoTitleBar.Fullscreen和其祖先包含您創建半透明窗口所需的所有屬性。爲了得到一切除了windowIsFloating我通過祖先堆去,掏出整套屬性:

<style name="Theme.CustomTheme.TransparentActivity"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:colorBackgroundCacheHint">@null</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowAnimationStyle">@android:style/Animation</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowFullscreen">true</item> 
</style> 

此樣式必須在AndroidManifest.xml,而不是一個佈局的根視圖被分配到Activity

6

在清單文件中使用像這樣的活動(主題代表了透明是活動的。)

<activity android:name=".Settings"  
      android:theme="@android:style/Theme.Translucent.NoTitleBar"/> 
0

接受的答案工作正常,直到我需要在對話框樣式窗口中有一個EditText爲止,因爲沒有windowIsFloating,軟IME鍵盤不會推動「對話框」。所以我必須正面解決'錯誤'。

與問題中的情況一樣,我需要將寬度設置爲"match_parent",而高度可以保持爲"wrap_content"。使用windowIsFloating,我最終設置了ViewTreeObserver,在佈局過程中遍歷視圖樹,並強制浮動窗口達到所需的寬度。該方法如下(onCreate()下的活動) -

setContentView(contentView); 

// set up the ViewTreeObserver 
ViewTreeObserver vto = contentView.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    int displayWidth = -1; 
    DisplayMetrics metrics = null; 
    View containerView = null; 

    @Override 
    public void onGlobalLayout() {    
     if (containerView == null) { 
      // traverse up the view tree 
      ViewParent v = contentView.getParent(); 
      containerView = contentView; 
      while ((v != null) && (v instanceof View)) { 
       containerView = (View) v; 
       v = v.getParent(); 
      } 
     } 
     if (metrics == null) { 
      metrics = new DisplayMetrics(); 
     } 
     Display display = getWindowManager().getDefaultDisplay(); 
     display.getMetrics(metrics); 
     if (displayWidth != metrics.widthPixels) { 
      displayWidth = metrics.widthPixels; 
      WindowManager.LayoutParams params = 
        (WindowManager.LayoutParams) containerView.getLayoutParams(); 
      // set the width to the available width to emulate match_parent 
      params.width = displayWidth; 
      // windowIsFloating may also dim the background 
      // do this if dimming is not desired 
      params.dimAmount = 0f; 
      containerView.setLayoutParams(params); 
      getWindowManager().updateViewLayout(containerView, params); 
     } 
    } 
}); 

這對於高至Android的7爲止(即使在分屏模式),但有可能趕上的可能投例外的情況下,鑄造WindowManager.LayoutParams未來的實施更改,並在適當的地方添加removeOnGlobalLayoutListener();