当显示 android.support.v7.app.AlertDialog 并且屏幕旋转时,应用程序在屏幕旋转时崩溃
App crashes on screen rotation when android.support.v7.app.AlertDialog is displayed and screen is rotated
我已经阅读了与此问题相关的所有问题并尝试了所有方法(包括使用 setRetainInstance
),但没有找到任何有效的方法。我将 dialogFragment 精简(见下文),但问题仍然存在。在其他地方阅读了一篇博客,其中作者说他已经在 Whosebug 上尝试了所有方法但没有成功,我决定像他那样做并关闭 onStop 中的 dialogFragment 并在 onStart 中重新创建它。但是我想我会问这个问题是否有新的解决方案。
在 Android Studio 中调试我刚刚收到一条不幸的应用程序已停止消息,没有捕获异常并且没有 logcat 输出。
这里是大大简化但仍然失败的代码:
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
public class TextViewDialogFragment extends DialogFragment
{
public TextViewDialogFragment()
{
super();
}
static public TextViewDialogFragment newInstance(int title, @Nullable String message, int identifier, int inputType, int positiveText, int negativeText, boolean cancelable)
{
TextViewDialogFragment fragement = new TextViewDialogFragment();
return fragement;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Using AppCompatActivity activity = (AppCompatActivity) getActivity(); does not help.
Activity activity = getActivity();
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setCancelable(true).setTitle("title");
AlertDialog dialog = alert.create();
return dialog;
}
}
我使用以下代码从 AppCompatActivity
创建并显示对话框:
folderAddGetName = TextViewDialogFragment.newInstance(R.string.add_folder, resources.getString(R.string.addFolderMessage, selectedFolderView.getText()), 1, InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, R.string.add, android.R.string.cancel, true);
folderAddGetName.show(getFragmentManager(), "addFolder");
首先,如果你使用AppCompatActivity
,你应该使用android.support.v4.app.DialogFragment
而不是android.app.DialogFragment
。也使用 folderAddGetName.show(getSupportFragmentManager(), "addFolder");
我将错误追溯到 activity 中的错误,该错误仅在创建 dialogfragment 时遇到。对话片段其实没问题。
我已经阅读了与此问题相关的所有问题并尝试了所有方法(包括使用 setRetainInstance
),但没有找到任何有效的方法。我将 dialogFragment 精简(见下文),但问题仍然存在。在其他地方阅读了一篇博客,其中作者说他已经在 Whosebug 上尝试了所有方法但没有成功,我决定像他那样做并关闭 onStop 中的 dialogFragment 并在 onStart 中重新创建它。但是我想我会问这个问题是否有新的解决方案。
在 Android Studio 中调试我刚刚收到一条不幸的应用程序已停止消息,没有捕获异常并且没有 logcat 输出。
这里是大大简化但仍然失败的代码:
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
public class TextViewDialogFragment extends DialogFragment
{
public TextViewDialogFragment()
{
super();
}
static public TextViewDialogFragment newInstance(int title, @Nullable String message, int identifier, int inputType, int positiveText, int negativeText, boolean cancelable)
{
TextViewDialogFragment fragement = new TextViewDialogFragment();
return fragement;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Using AppCompatActivity activity = (AppCompatActivity) getActivity(); does not help.
Activity activity = getActivity();
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setCancelable(true).setTitle("title");
AlertDialog dialog = alert.create();
return dialog;
}
}
我使用以下代码从 AppCompatActivity
创建并显示对话框:
folderAddGetName = TextViewDialogFragment.newInstance(R.string.add_folder, resources.getString(R.string.addFolderMessage, selectedFolderView.getText()), 1, InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, R.string.add, android.R.string.cancel, true);
folderAddGetName.show(getFragmentManager(), "addFolder");
首先,如果你使用AppCompatActivity
,你应该使用android.support.v4.app.DialogFragment
而不是android.app.DialogFragment
。也使用 folderAddGetName.show(getSupportFragmentManager(), "addFolder");
我将错误追溯到 activity 中的错误,该错误仅在创建 dialogfragment 时遇到。对话片段其实没问题。