更新到最新的支持库后,
compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:design:24.2.0' compile 'com.android.support:percent:24.2.0' compile 'com.android.support:recyclerview-v7:24.2.0'
我得到了奇怪的例外.
java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state. at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435) at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:414) at android.support.v4.app.DialogFragment.show(DialogFragment.java:154) at com.androidapp.base.BaseActivity.showDialogFragment(BaseActivity.java:78) at com.androidapp.MainActivity.showNewDialog(MainActivity.java:304) at com.androidapp.MainActivity$6.onClick(MainActivity.java:228)
在我的BaseActivity类中,我创建了一个可重用的片段,可以在活动类中使用,扩展了BaseActivty
public void showDialogFragment(DialogFragment newFragment) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); if (prev != null) { ft.remove(prev); } ft.addToBackStack("dialog"); newFragment.show(ft,"dialog"); }
回到MainActivty我已经使用了这样的片段,
public class MainActivity extends BaseActivity { @SuppressLint("ValidFragment") public void showNewDialog(int type,String title,String message) { final DialogNew dialog = new DialogNew() { @Override public void success(boolean isLandscape) { ....... } @Override public void cancel() { } }; dialog.setArgs(title,message); super.showDialogFragment(dialog); } }
DialogNew类在下面,
public abstract class DialogNew extends DialogFragment { private View rootView; private String title; private String message; public void setArgs(String title,String message) { Bundle args = new Bundle(); args.putString("title",title); args.putString("message",message); setArguments(args); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(STYLE_NO_TITLE,0); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_new_dialog,container,false); init(); setListeners(); return rootView; } public abstract void success(boolean isLandscape); public abstract void cancel(); }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。