方向更改后显示对话框时出现异常

时间:2014-08-14 06:10:48

标签: android android-fragments

我在其中有一个活动和一个片段。内部片段,有一个按钮,点击按钮会显示一个对话框。

一切正常,直到用户进行方向更改并点击后按钮。 当用户在方向更改后单击按钮时,会发生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){

}

}

1 个答案:

答案 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)来检索   布局资源中的属性虽然应该在这里注意   因为片段附加到它的活动会发生这种情况。