从 Fragment 中的 ListView 中的按钮创建 PopupView
Creating PopupView from button in ListView in Fragment
我正在尝试使用底部导航在我的应用程序中实现弹出视图(我正在为导航中的每个项目使用片段)。在一个片段中,我有 ListView
个项目。每个项目中都有按钮,我想创建弹出视图来告知有关其项目的更多信息。
我已经尝试在单独的应用程序中创建弹出窗口,并且效果很好,因此我认为这是我的应用程序结构稍微复杂的问题。 (Activity - fragment - 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 的新手,我将非常感谢您的任何建议!感谢阅读
编辑:
我想我在
中找到了问题
popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
我使用在onViewCreated
中分配的popupLayout
作为
popupLayout = (RelativeLayout) view.findViewById(R.id.relative);
并将其指定为 null(这似乎是导致错误的原因)。
尝试这样的事情
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);
替换popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
来自 popupWindow.showAtLocation(getView(), Gravity.NO_GRAVITY ,400, 400);
我正在尝试使用底部导航在我的应用程序中实现弹出视图(我正在为导航中的每个项目使用片段)。在一个片段中,我有 ListView
个项目。每个项目中都有按钮,我想创建弹出视图来告知有关其项目的更多信息。
我已经尝试在单独的应用程序中创建弹出窗口,并且效果很好,因此我认为这是我的应用程序结构稍微复杂的问题。 (Activity - fragment - 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 的新手,我将非常感谢您的任何建议!感谢阅读
编辑:
我想我在
中找到了问题popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
我使用在onViewCreated
中分配的popupLayout
作为
popupLayout = (RelativeLayout) view.findViewById(R.id.relative);
并将其指定为 null(这似乎是导致错误的原因)。
尝试这样的事情
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);
替换popupWindow.showAtLocation(popupLayout, Gravity.NO_GRAVITY ,400, 400);
来自 popupWindow.showAtLocation(getView(), Gravity.NO_GRAVITY ,400, 400);