Создание PopupView из кнопки в ListView во фрагменте - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь реализовать всплывающее представление в моем приложении с нижней навигацией (я использую фрагменты для каждого элемента в навигации). В одном фрагменте у меня есть ListView с предметами. У каждого предмета есть кнопка, и я хочу создать всплывающее окно, которое сообщает дополнительную информацию о его предмете.

Я пытался создавать всплывающие окна в отдельных приложениях на действиях, и это работало просто отлично, поэтому я предполагаю, что это проблема немного сложной структуры моего приложения. (Activity - фрагмент - listView - Item - кнопка, которая вызывает всплывающее окно)

Вот мой код:

Фрагмент:

public class myFragment extends Fragment implements myListAdapter.EventListener {

...

@Override
public void setPopupLayout() {

    Log.d(TAG, "setPopupLayout");

    LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View popupView =  layoutInflater.inflate(R.layout.popup_compressors, null);

    PopupWindow popupWindow = new PopupWindow(popupView, 500, 500, true);

    TextView textView = popupView.findViewById(R.id.popup_details);
    textView.setText("xd");

    // Here the error seems to occur
    popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
}

Адаптер:

public class myAdapter extends ArrayAdapter<Compressor>
{
private static final String TAG = "Compressor Adapter";

EventListener myListener;

// (...)

@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {

// (...)  

    Button button = convertView.findViewById(R.id.comp_details);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "onClick: button");
            myListener.setPopupLayout();
        }
    });
    return convertView;
}

Когда я нажимаю кнопку в listView, приложение печатает как Log.d(TAG, "onClick: button");, так и Log.d(TAG, "setPopupLayout");. Затем NullPointerExeption бросается:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' on a null object reference

и эта строка подсвечивается:

popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);

Я все еще новичок в Android и буду очень благодарен за любой совет! Спасибо за чтение

EDIT:

Я думаю, что нашел проблему, в

popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);

Я использую popupLayout, который назначен в onViewCreated как

popupLayout = (RelativeLayout) view.findViewById(R.id.relative);

и это назначено как ноль (который, кажется, вызывает ошибку).

Ответы [ 2 ]

0 голосов
/ 18 января 2019

заменить popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);

по popupWindow.showAtLocation(getView(), Gravity.NO_GRAVITY ,400, 400);

0 голосов
/ 14 января 2019

Попробуйте что-то вроде этого

Fragment.class

View popupView =  layoutInflater.inflate(R.layout.popup_compressors, null);
final PopupWindow popupWindow = new PopupWindow(popupView, 500, 500);

popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
...