【发布时间】:2017-01-10 18:00:44
【问题描述】:
更新到最新的支持库后,
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
的 Activity 类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();
}
PS:相同的代码适用于较旧的支持存储库。
【问题讨论】:
-
为什么
DialogNew是抽象的?你不能实例化一个抽象类。 -
@Vucko 没关系。当做这种事情时,是的,你是对的,你不能实例化一个抽象,而是会初始化一个扩展该抽象类的匿名类。总之没有问题。
-
在支持库版本 24.2.1 中面临同样的错误
-
然后添加! , 解决办法是什么 ! ,我得到了旧代码,并尝试更新支持库,它崩溃的原因,我们该怎么办?
-
你需要明确定义一个公共的无参数构造函数,Android不是一个普通的java!
标签: android android-fragments android-support-library android-dialogfragment fragmentmanager