我是Android开发的新手,对如何完成我想要做的事情感到困惑。我做了一些关于片段的阅读和学习,这样我就可以在不同的屏幕尺寸设计之间分享布局和代码。我已经创建了几个片段,并成功地使用了它们。但我遇到了这样的情况:我想在手机上显示正常活动中的片段,但又想在平板电脑上显示PopupWindow中的片段(如果有更好的选择,也可以是类似的东西)。
我已经设法弄清楚了如何扩展片段,并在单击按钮时在PopupWindow中显示它。我的代码如下所示:
public void onClick(View v) {
LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false);
connectionListPopup = new PopupWindow(popupLayout, 300, 470, true);
connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0);
}
弹出窗口随即出现,其中包含在serverconnection_fragment.xml中描述的UI。问题是,通过这种方式创建它,片段类ServerConnectionFragment.java永远不会被实例化,因此我的UI中的列表中没有项,按钮上也没有侦听器,等等。对于我来说,似乎应该有一种方法来实例化java类,让它正常地膨胀片段并附加事件侦听器,然后将在那里创建的视图传递到PopupWindow构造函数中,但我不知道如何实现。有人能帮我吗?
仅供参考,我是为Android2.1使用Android-support-v4.jar文件为片段类构建的。
发布于 2012-03-11 21:24:23
直接膨胀布局不会导致它实例化片段;Android只会认为这只是巧合,片段和活动都试图引用相同的布局文件。
通常,可以使用FragmentManager.add(int,Fragment)将片段添加到布局中。但是,您指定的容器id必须是当前Activity布局的一部分,而PopupWindow
并非如此。相反,您必须在不指定容器的情况下将片段添加到片段管理器,然后在稍后的片段中(例如onStart()
),您可以显示PopupWindow。这正是DialogFragment
的工作方式,既然已经有了很多对它的支持,我建议您改用DialogFragment。
使用您的片段代码,只需扩展DialogFragment而不是片段,并使用DialogFragment.show(FragmentManager,String)来显示它。您可以通过在onCreate
方法中调用setStyle(DialogFragment.STYLE_NO_FRAME, getTheme())
来摆脱默认边框。您仍然可以将此片段添加到布局中(如您所说,在手机上,您不希望它显示为弹出窗口),它将按照您预期的方式工作。
https://stackoverflow.com/questions/8044593
复制相似问题