我在其中有一个活动和一个片段。内部片段,有一个按钮,点击按钮会显示一个对话框。
一切正常,直到用户进行方向更改并点击后按钮。 当用户在方向更改后单击按钮时,会发生IllegalStateException(在onsaveinstancestate之后无法执行此操作)。我正在使用android支持框架。
有人有任何想法吗?
活动代码
public void openMoreDialog(String shareData, String link) {
DialogFragment dialog = new MoreDialog(shareData, link);
dialog.show(getSupportFragmentManager(), "MoreDialog");
}
片段代码
public void onAttach(Activity activity) {
super.onAttach(activity);
mControl = (ActivityControl)activity;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
ImageButton moreButton = (ImageButton)v.findViewById(R.id.moreButton);
moreButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mControl.openMoreDialog(shareData, link);
}
});
return rootView;
}
FragmentDialog代码
public class MoreDialog extends DialogFragment {
private String mShareData;
private String mLink;
public MoreDialog(String shareData, String link){
mShareData = shareData;
mLink = link;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
View dialogView = inflater.inflate(R.layout.more_dialog, null);
Button openBtn = (Button)dialogView.findViewById(R.id.openBtn);
openBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openLink(mLink);
}
});
Button shareBtn = (Button)dialogView.findViewById(R.id.shareBtn);
shareBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
shareNews(mShareData);
}
});
builder.setView(dialogView);
return builder.create();
}
private void openLink(String link){
}
private void shareNews(String data){
}
}
答案 0 :(得分:0)
有用的链接&解决方法如何: https://stackoverflow.com/a/17413324/619673和btw,片段中的构造函数必须为空!文档: http://developer.android.com/reference/android/app/Fragment.html
public Fragment() 在API级别11中添加
默认构造函数。
每个片段都必须有一个空构造函数,所以 它可以在恢复其活动状态时进行实例化。它是 强烈建议子类没有其他构造函数 带参数,因为这些构造函数不会被调用 片段被重新实例化;相反,参数可以由。提供 调用者使用setArguments(Bundle),然后由Fragment检索 使用getArguments()。
应用程序通常不应该实现构造函数。首先 将应用程序代码放置在可以使用片段的运行中 在onAttach(Activity)中,片段实际上就是这个点 与其活动相关联。一些应用程序也可能想要 实现onInflate(Activity,AttributeSet,Bundle)来检索 布局资源中的属性虽然应该在这里注意 因为片段附加到它的活动会发生这种情况。