2013-05-29 1 views
0

Я пытаюсь показать всплывающее окно после нажатия кнопки «Изображение». Я создал дополнительный макет для всплывающего окна и использовал LayoutInflater для создания представления из макета. Я устанавливаю всплывающее окно с этой точки зрения, используя «setContentView»java.lang.NullPointerException: at android.widget.PopupWindow.setContentView при попытке раздувания макета

PopupWindow popupWindow = new PopupWindow(); 
LayoutInflater popupLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View popupWindowView = null; 

     try{ 
      popupWindowView = popupLayoutInflater.inflate(R.layout.popuplayout, null); 
     } 
     catch(InflateException e){ 
      System.out.println(e.getMessage()); 
     } 

     if(popupWindowView!=null) 
      popupWindow.setContentView(popupWindowView); 
     popupWindow.showAtLocation(parentView, android.view.Gravity.NO_GRAVITY, 10, 10); 
    } 

Я получаю NullPointerException как функция надуйте возвращается нуль.

05-29 00:20:08.582: W/dalvikvm(304): threadid=1: thread exiting with uncaught exception  (group=0x4001d800) 
05-29 00:20:08.592: E/AndroidRuntime(304): FATAL EXCEPTION: main 
05-29 00:20:08.592: E/AndroidRuntime(304): java.lang.NullPointerException 
05-29 00:20:08.592: E/AndroidRuntime(304): at  android.widget.PopupWindow.setContentView(PopupWindow.java:377) 
05-29 00:20:08.592: E/AndroidRuntime(304): at android.widget.PopupWindow.<init>(PopupWindow.java:279) 
05-29 00:20:08.592: E/AndroidRuntime(304): at android.widget.PopupWindow.<init>(PopupWindow.java:259) 
05-29 00:20:08.592: E/AndroidRuntime(304): at android.widget.PopupWindow.<init>(PopupWindow.java:216) 

Я не уверен, где я ошибся. Пожалуйста, помогите

ответ

0

Обнаружено обходное решение проблемы. Ошибка была связана с кодом строки

PopupWindow popupWindow = new PopupWindow(); 

Это неявное обращение к методу setContentView. В приведенном ниже коде отлично работает, где я использую другую версию конструктора PopupWindow с параметрами View, height и width.

public void onClick(View arg0) { 

     LayoutInflater popupLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View popupWindowView = null; 
     PopupWindow popupWindow = null; 
     try{ 
      popupWindowView = popupLayoutInflater.inflate(R.layout.popuplayout, null); 
     } 
     catch(InflateException e){ 
      System.out.println(e.getMessage()); 
     } 


     if(popupWindowView!=null) 
     { 
      popupWindow = new PopupWindow(popupWindowView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
     } 
     if(popupWindow!=null) 
      popupWindow.showAtLocation(parentView, android.view.Gravity.NO_GRAVITY, 100, 100); 

    } 
1

Для тех, кто мог бы иметь эту ошибку в будущем, я нашел на sourceCode что есть конструктор с PopupWindow (View contentView) и называется.

Так что я нашел обходное решение: вместо вызова прямого конструктора я создаю статический метод, который возвращает экземпляр этого представления. И он сначала создает ContentView, передает конструктору, чтобы он мог вызвать конструктор super (contentView). Вот и все.

public class MenuPopup extends PopupWindow { 

    public static MenuPopup getInstance(Activity act) { 
     LayoutInflater inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     contentView = inflater.inflate(R.layout.menu, null); 
     IvrMenuNew popup = new IvrMenuNew(act, contentView); 
     return popup; 
    } 

    public MenuPopup (Activity act, View contentView) { 
     super(contentView); 
     // TODO: whatever else you need to do... 
    } 
} 
1

Мои 2 цента до решения.

Если у вас есть переопределенный конструктор MyPopupWindow (контекст контекста) и по-прежнему получаю исключение NullPointerException - проверьте, вызываете ли вы супер (контекст) в первой строке, потому что вы, вероятно, этого не делаете).