2013-09-04 2 views
0

Я пытаюсь раздуть PopupWindow с кнопки, которая находится внутри элементов списка (из адаптера пользовательского списка), но я получаю NullPointerExceptions в нескольких местах.NullPointerException при раздувании PopupWindow

Вот OnClick для кнопки, где я пытаюсь сделать PopupWindow случиться:

public void onClick(View v) { 
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    PopupWindow pw = null; 
if (scores[0] == null) { 
    pw = new PopupWindow(inflater.inflate(R.layout.tag_table_row, null, false), 100, 100, true); 
    TextView tag = (TextView) v.findViewById(R.id.tag); 
    tag.setText("error!"); 
} else { 
    int x = tags.length; 
    int y = 5; 
    int z = Math.min(x, y); 

    for (int i = 0; i < z; i++) { 
     pw = new PopupWindow(inflater.inflate(R.layout.tag_table_row, null, false), 100, 100, true);       
      TextView tag = (TextView) v.findViewById(R.id.tag); 
      tag.setText(tags[i]); 
      int tag1score = Double.parseDouble(scores[i]); 
      TextView score = (TextView) v.findViewById(R.id.tagscore); 
      score.setText(Integer.toString(tag1score)); 
    } 
} 
pw.showAtLocation(v.findViewById(R.id.fragment_content), Gravity.CENTER, 0, 0); 
} 

Я получаю NullPointerException в tag.setText(tags[i]);. Если я прокомментирую это и попробую сделать оценки, я получаю исключение NullPointerException по адресу score.setText(Integer.toString(tag1score));. Оба тега [] и оценки [] инициализируются и заполняются перед onClick, и я тестировал их, чтобы гарантировать, что результаты в обоих являются строками и НЕ равными нулю.

Любые мысли о том, почему этот NPE происходит?

+0

Что произойдет, если вы просто выполните TextView tag = (TextView) findViewById (R.id.tag); 'без использования' v'? –

+0

Я получаю ошибку «Метод findViewById (int) не определен для типа new View.OnClickListener() {}" – user2163853

+1

В принципе вам нужно получить правильный контекст. Попытайтесь получить контекст окна/активности, где находится ваш TextView. –

ответ

1

Вам нужно использовать правильную вещь, чтобы искать вид. Вы раздуваетесь в pw, но вы смотрите в v для своих просмотров. Я думаю, что это может работать лучше;

public void onClick(View v) { 
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View popupView = null; 
    PopupWindow pw = null; 
    if (scores[0] == null) { 
     popupView = layoutInflater.inflate(R.layout.tag_table_row, null, false); 
     pw = new PopupWindow(popupView, 100, 100, true);      

     TextView tag = (TextView) v.findViewById(R.id.tag); 
     tag.setText("error!"); 
    } else { 
     int x = tags.length; 
     int y = 5; 
     int z = Math.min(x, y); 

     for (int i = 0; i < z; i++) { 
      popupView = layoutInflater.inflate(R.layout.tag_table_row, null, false); 
      pw = new PopupWindow(popupView, 100, 100, true);      
      TextView tag = (TextView) popupView.findViewById(R.id.tag); 
      tag.setText(tags[i]); 
      int tag1score = Double.parseDouble(scores[i]); 
      TextView score = (TextView) popupView.findViewById(R.id.tagscore); 
      score.setText(Integer.toString(tag1score)); 
     } 
    } 
    pw.showAtLocation(popupView, Gravity.CENTER, 0, 0); 
} 

он отслеживает вид, в который вы завалили, поэтому вы можете искать его для своих элементов.

+0

Спасибо. То, что вы говорите, имеет смысл для меня. Но ... popupwindow не имеет метода findViewById (или, похоже, ничего подобного). Мысли? – user2163853

+0

см. Изменения в ответе. Вы должны отслеживать просматриваемое представление. – HalR

+1

'TextView score = (TextView) pw.findViewById (R.id.tagscore);' должен быть 'TextView score = (TextView) popupView.findViewById (R.id.tagscore);'. – Vikram

Смежные вопросы