2011-10-08 10 views
10

वहां मौजूद अधिकांश उदाहरण पॉपअप विंडो की चौड़ाई और ऊंचाई निर्दिष्ट करते हैं। मैं उन्हें WRAP_CONTENT होना चाहते हैं - तो निर्माता में मैं दोनों चौड़ाई और ऊंचाई के लिए -2 सेट के बाद से सामग्री dinamically निर्धारित किया जाता है, और showAsDropDown (देखें लंगर)आकार के बिना पॉपअपविंडो स्क्रीन से बाहर

ऐसा करने के माध्यम से यह दिखाने के लिए, पॉपअप हमेशा तैयार की है एंकर दृश्य के नीचे, जिसका अर्थ है कि इसे ऑफस्क्रीन खींचा जा सकता है। निम्नलिखित स्निपेट समस्या का प्रदर्शन करता है। अंतिम टेक्स्ट व्यू पर क्लिक करने का प्रयास करें और आपको कोई पॉपअपविंडो दिखाई नहीं देगा, क्योंकि यह विंडोज़ सीमाओं के बाहर दिखाया गया है। यह क्यों काम नहीं करता है? मैंने टिप्पणी की है कि स्पष्ट रूप से आयाम निर्दिष्ट करना (उदाहरण के लिए 200, 100) समस्या को ट्रिगर नहीं करता है। यह अपने आप का प्रयास करें

package com.zybnet.example.popupdemo; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.LinearLayout; 
import android.widget.PopupWindow; 
import android.widget.TextView; 

public class PopupDemoActivity extends Activity implements OnClickListener { 
    private PopupWindow popup; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // -2 means WRAP_CONTENT THIS TRIGGERS THE PROBLEM 
     popup = new PopupWindow(getPopupContent(), -2, -2); 
     // When you specify the dimensions everything goes fine 
     //popup = new PopupWindow(getPopupContent(), 200, 100); 

     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 

     // FILL_PARENT and same layout weight for all children 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -1, 1); 
     for (int i = 0; i < 10; i++) { 
      TextView tv = new TextView(this); 
      tv.setText("Click to show popup"); 
      tv.setOnClickListener(this); 
      layout.addView(tv, params); 
     } 
     setContentView(layout); 
    } 

    @Override 
    public void onClick(View view) { 
     popup.dismiss(); 
     popup.showAsDropDown(view); 
    } 

    private View getPopupContent() { 
     TextView popupContent = new TextView(this); 
     popupContent.setText("Some text here"); 
     popupContent.setTextColor(Color.parseColor("#5000ae")); 
     popupContent.setBackgroundColor(Color.parseColor("#ff00ff")); 
     popupContent.setPadding(10, 20, 20, 10); 
     return popupContent; 
    } 
} 

उत्तर

16

मुझे शक है कि एक PopupWindow कि -2 के संदर्भ में शुरू कर, -2 वास्तव में इसका मतलब है WRAP_CONTENT बल्कि मुझे लगता है कि इसकी सिर्फ चौड़ाई के रूप में यह व्याख्या = -2 ऊंचाई = -2

यह जहां setWidth(int width) सिर्फ एक सरल mWidth = width; मुझे लगता है कि आप के लिए देख रहे हैं बजाय setWindowLayoutMode (int widthSpec, int heightSpec) तरीका है एंड्रॉयड स्रोत

public PopupWindow(View contentView, int width, int height, boolean focusable) { 
    if (contentView != null) { 
     mContext = contentView.getContext(); 
     mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
    } 
    setContentView(contentView); 
    setWidth(width); 
    setHeight(height); 
    setFocusable(focusable); 
} 

से है। यही कारण है कि जहां WRAP_CONTENT

में पारित करना चाहिए बाकी सब विफल रहता है, चौड़ाई और TextView की ऊंचाई मापने और उसके बाद setWidth और setHeight का उपयोग के रूप में उम्मीद है।

संपादित:

बस इसे खुद के लिए बाहर की कोशिश की और यह काम

// -2 means WRAP_CONTENT THIS TRIGGERS THE PROBLEM 
    popup = new PopupWindow(getPopupContent(), 200, 100); 
    popup.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
    // When you specify the dimensions everything goes fine 
    //popup = new PopupWindow(getPopupContent(), 200, 100); 

    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 

मैं वहाँ में मूल टिप्पणी छोड़ दिया है ताकि आप देख सकते हैं अपने आप के लिए जहां सब कुछ बनाने के लिए कोड की इस पंक्ति जोड़ा जाना चाहिए।

संपादित करें 2: ठीक है, तो मैं अपने कोड आप पोस्ट और शब्दशः अपने डिवाइस पर इसे करने की कोशिश ले लिया, और तुम सही, उस में यह डाल करने के लिए लेआउट के लिए काम नहीं किया गया है क्योंकि जब एंड्रॉयड जो विचारों का निर्धारण किया जाता है , यह आपके द्वारा प्रदान की गई चौड़ाई और ऊंचाई पर निर्भर करता है। इसका मतलब यह है कि चूंकि आप अपनी चौड़ाई और ऊंचाई के रूप में 0 और 0 का उपयोग कर रहे हैं, एंड्रॉइड साथ आएगा और कहेंगे, "ओह देखो, बॉक्स केवल 0 0 बॉक्स है, इसलिए मैं इसे सामग्री के नीचे पॉपअप के रूप में प्रदर्शित कर सकता हूं।" हालांकि वांछित नहीं है! बात यह है कि, आप जानते हैं कि बॉक्स उस से बड़ा होगा, इसलिए चलिए कुछ अलग-अलग संख्याओं को डालने लगें और इससे आने वाले नतीजे देखें।

popup = new PopupWindow(getPopupContent(), 1, 1); 

अब जब मैं जाता हूं और नीचे के बॉक्स पर क्लिक करता हूं, तो ध्यान दें कि यह ऊपर कूदता है। (स्क्रीनशॉट देखें) ऐसा इसलिए है क्योंकि एंड्रॉइड जानता है कि चौड़ाई और ऊंचाई 1 है (जैसा कि मैंने कन्स्ट्रक्टर में सेट किया है) और सूची आइटम के नीचे उपलब्ध स्क्रीन स्पेस 0 है। ठीक है, अगर वहां इसे प्रदर्शित करने के लिए पर्याप्त जगह नहीं है, तो यह तब ऊपर होना चाहिए!

enter image description here

लेकिन रुकिए! क्या होगा यदि मेरे वर्तमान उदाहरण में स्ट्रिंग हर बार अधिक सामग्री पर जोड़ती है? खैर, यह वह जगह है जहां चीजें दिलचस्प होती हैं। आप देखते हैं, मेरे अगले स्क्रीनशॉट में पॉपअप, भले ही इसे प्रदर्शित किया जाना चाहिए क्योंकि यह अब 6 लाइन लंबी है, बल्कि नीचे दिखाया गया है! ओह बकवास, ठीक है!ऐसा इसलिए है क्योंकि यह 1 1 के खिलाफ माप रहा है जिसे मैंने कन्स्ट्रक्टर में उपयोग किया था। वैसे तो इसके कुछ समाधान क्या हैं?

enter image description here

समाधान एक: मेरा पसंदीदा तरीका क्या TextView की औसत अधिकतम ऊंचाई होगा और उसके बाद केवल एक सामान्य रूप से बड़ी संख्या में टॉस पर एक अनुमान लेने के लिए होगा।

popup = new PopupWindow(getPopupContent(), 300, 300); //just guessing it won't get bigger than that 

समाधान दो: यह अधिक उचित है, लेकिन आप इसे करने के लिए थोड़ी सी गति का त्याग कर रहे हैं। पॉपअप प्रदर्शित करने से पहले setWidth() और setHeight() में पाठ सामग्री का आकार क्या हो रहा है और इसे पारित करने के लिए Paint कक्षा का उपयोग करना। मैं आगे चला गया और एक लगभग पूर्ण समाधान का निर्माण किया है, लेकिन मैं गद्दी और सामान में मापने नहीं किया

private int maxWidth; 
private int maxHeight; 
private Paint p = new Paint(); 
private Rect bounds = new Rect(); 
private View getPopupContent() { 
    maxWidth = 0; 
    maxHeight = 0; 
    TextView popupContent = new TextView(this); 
    popupContent.setText(popupText += "\n" + DEMO); 
    popupContent.setTextColor(Color.parseColor("#5000ae")); 
    popupContent.setBackgroundColor(Color.parseColor("#ff00ff")); 
    popupContent.setPadding(10, 20, 20, 10); 
    //the measure can only work line by line so I split it up by line 
    String[] temp = popupText.split("\n"); 
    for (String s : temp){ 
     //measure each line of string and get its width and height 
     p.getTextBounds(s, 0, s.length(), bounds); 

     //keep a running total of the longest width 
     maxWidth = (bounds.width() > maxWidth) ? bounds.width() : maxWidth; 
     //add up each of the heights 
     maxHeight += bounds.height(); 
    } 

    //also take in account the padding too... if you REALLY want it to be completely robust 
    //probably adding another 20 or 30 to the maxHeight should be good 
    return popupContent; 
} 

(टिप्पणी देखें) और फिर onClick() में मैं इन दो पंक्तियों

popup.setHeight(maxHeight); 
    popup.setWidth(maxWidth); 
+0

मैं स्रोतों भी पढ़ा है, और इसे और अधिक एक ए लगता है एंड्रॉइड बग, क्योंकि आकार सही है, लेकिन प्लेसमेंट गलत है। मैंने डेमो प्रदान करने के बाद से इसे स्वयं परीक्षण कर सकते हैं। अब मैं PopupWindow.showAtLocation() – Raffaele

+0

के साथ प्रयोग कर रहा हूं, जैसा कि मुझे संदेह है कि आपको 'setWindowLayoutMode' में जोड़ने की आवश्यकता है, मैंने अपना जवाब संपादित किया और आपको आवश्यक सटीक कार्य कोड में जोड़ा गया। मैंने इसे अपने एंड्रॉइड डिवाइस और सब कुछ पर परीक्षण किया! :) – Bob

+0

अगली बार जब आप पॉपअप का आह्वान करते हैं तो सामग्री दृश्य में परिवर्तन होता है तो क्या होता है? यही कारण है कि मुझे WRAP_CONTENT – Raffaele

1
जोड़ा

मैं एक पॉपअप सामग्री को ध्यान में रखते measure() विधि को फोन करके इस समस्या का समाधान:

View content = getPopupContent(); 

content.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
int measuredHeight = content.getMeasuredHeight(); 

popup = new PopupWindow(content, ViewGroup.LayoutParams.WRAP_CONTENT, measuredHeight); 
संबंधित मुद्दे