2011-10-25 15 views
18

windowIsFloating जबकि Dialog स्टाइल यूआई के निर्माण के लिए एक बड़ी दुकान बंद करें, --- बग --- quirks है।खिड़की के बिना एक पारदर्शी गतिविधि कैसे बनाएं I12F98ating

एक जो मैं अभी कर रहा हूँ से जूझ है कि यह ""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> 

कौन सा एक एकल खिड़की दिखा एक यूआई (पैदा करता है @ आईडी/सिंगलपेन) गतिविधि की शुरुआत जिसे इसे कहा जाता है।

क्या किसी के पास है जो पारदर्शी पृष्ठभूमि गतिविधि बनाने के लिए आवश्यक शैलियों का सेट है?

उत्तर

29

धन्यवाद:

विषय 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

मैनिफ़ेस्ट फ़ाइल में गतिविधि के लिए इस तरह का उपयोग करें (विषय है कि गतिविधि के पारदर्शी प्रतिनिधित्व करता है।) जो मुझे जवाब मैं चाहता था की ओर धकेल दिया था @PolamReddy को

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

स्वीकार किए जाते हैं जवाब है, ठीक काम करता है जब तक मैं, संवाद-शैली वाली विंडो के अंदर एक EditText है करने के लिए के रूप में मुलायम IME कुंजीपटल "संवाद" को windowIsFloating बिना धक्का नहीं होगा की जरूरत है। तो मुझे 'बग' हेड-ऑन से निपटना होगा।

प्रश्न के मामले में, मुझे चौड़ाई "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); 
     } 
    } 
}); 

यह अब तक (विभाजित स्क्रीन मोड में भी) एंड्रॉयड 7 अप करने के लिए काम करता है, लेकिन एक मामले में WindowManager.LayoutParams लिए कास्टिंग के लिए संभव डाली अपवाद को पकड़ सकता है भविष्य में कार्यान्वयन में परिवर्तन, और उचित स्थान पर removeOnGlobalLayoutListener(); जोड़ें।

संबंधित मुद्दे