2012-07-18 96 views
0

我嘗試創建PopupWindow對象。現在我有遵循XML代碼:PopupWindow正在Android 2.1上工作,但不能在其他版本上工作

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toast_root" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/toast2_2" 
     android:layout_gravity="center" 
     android:clickable="true" 
     android:maxWidth="270dp" 
     android:textColor="#000000" 
     android:textSize="18sp" /> 

    <ImageView 
     android:id="@+id/ptr" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/toast2_1" /> 

</LinearLayout> 

,並按照Java代碼:

package com.izhmap.helpers; 

import android.graphics.Rect; 
import android.graphics.drawable.BitmapDrawable; 
import android.text.TextPaint; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.WindowManager; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.PopupWindow; 
import android.widget.TextView; 

import com.izhmap.map.R; 

public class DynamicPopup { 

    private int MAX_POPUP_WIDTH = 270; 

    private PopupWindow _pw = null; 
    LinearLayout _toastLayout = null; 
    View _parentView = null; 
    TextView _popupText = null; 
    // class constructor 
    public DynamicPopup(LinearLayout toastLayout, View parentView, DisplayMetrics dm) { 
     MAX_POPUP_WIDTH*=dm.density; 
     _toastLayout = toastLayout; 

     _popupText = (TextView)_toastLayout.findViewById(R.id.text); 

     _parentView = parentView; 

     _pw = new PopupWindow(parentView.getContext()); 
     _pw.setTouchable(true); 
     _pw.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     _pw.setBackgroundDrawable(new BitmapDrawable()); 
     Log.d("DynamicPopup","st: DynamicPopup(), MAX_POPUP_WIDTH = "+MAX_POPUP_WIDTH); 
    } 

    public void showPopup(int x, int y, String text, ViewGroup.MarginLayoutParams mpl) { 
     // Set new text to PopupWindow 
     _popupText.setText(text); 
     // choose the appropriate background size 
     Rect bounds = getPopUpRect(text); 

     int h = bounds.height(); 
     int w = bounds.width(); 

     Log.d("IzhMap","Popup: w="+w+" w = "+h); 

     _toastLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
     h = _toastLayout.getMeasuredHeight(); 
     w = _toastLayout.getMeasuredWidth(); 

     if((x - (w/2)) < 0) { 
      mpl.setMargins(x - 11, 0, 0, 0); 
     } else { 
      if((x + (w/2)) > 10000) { 
       mpl.setMargins(x + 11, 0, 0, 0); 
      } else { 
       mpl.setMargins(w/2 - 11, 0, 0, 0); 
      } 
     } 

     _pw.setContentView(_toastLayout); 

     _pw.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
     _pw.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

     _pw.setClippingEnabled(true); 
     Log.d("IzhMap","Popup:show x="+(x-w/2)+" y = "+y); 

     if(h > 64) { 
      _pw.showAtLocation(_parentView, Gravity.NO_GRAVITY, x - w/2, y - bounds.height() - 30); 
     } else { 
      _pw.showAtLocation(_parentView, Gravity.NO_GRAVITY, x - w/2, y - bounds.height() - 15); 
     } 
     _pw.update(_parentView, x - w/2, y - h, -1, -1); 
    } 

    private Rect getPopUpRect(String text) { 
     Rect r = new Rect(); 

     TextPaint tp = _popupText.getPaint(); 
     float fontSize = _popupText.getTextSize(); 

     tp.setTextSize(fontSize); 
     tp.getTextBounds(text, 0, text.length(), r); 

     Log.d("IzhMap", "popUp need width: " + r.toShortString()); 

     int w = r.width(); 
     int h = r.height(); 

     if (w>=MAX_POPUP_WIDTH) { 
      while (w>=MAX_POPUP_WIDTH) { 
       w-=MAX_POPUP_WIDTH; 
       h+=r.height(); 
      } 

      r.set(0, 0, MAX_POPUP_WIDTH, h); 
     } 

     Log.d("IzhMap", "popUp width: " + r.toShortString()); 

     return r; 
    } 

    public void hidePopup(){ 
     _pw.dismiss(); 
    } 

    public boolean isShowing() { 
     return _pw.isShowing(); 
    } 
} 

如果在Android 2.1設備上運行的應用程序,然後我可以看到這個彈出窗口。如果應用程序在Android 4.1或3.2設備上運行,那麼我看不到彈出窗口。此應用程序運行時,Android 2.3設備不響應​​。

你能幫我嗎?

回答

0

我發現了這個問題。當我刪除後續行:

_pw.update(_parentView, x - w/2, y - h, -1, -1); 

PopupWindow工作正常。

相關問題