Intereting Posts
Android: AsyncTask ИЛИ обычные потоки Java с ExecutorService Какое влияние на конечный APK влияет на цель сборки Android? Как получить доступную высоту экрана минус панель навигации в HoneyComb? OnLoadFinished () вызывается дважды Как имитировать: активный css псевдокласс в android на элементах без ссылки? Автоматический вызов службы уничтожения Как избежать научной нотации в двойном? В размер шрифта для файлов Photoshop размер 20px, что будет для этого в Android? Это то же самое? Означает 20px = 20sp или что-то еще? FragmentPagerAdapter getItem не вызывается Как заставить основную Acivity ждать субактивности в Android? Запустить приложение facebook из другого приложения Нарисуйте панель навигации (и другие приложения) в версии Android> = 5 Как отправить объект JSON через запрос HttpClient с Android? Замените устаревший файл android.support.v4.app.ActionBarDrawerToggle с поддержкой, вызывающим вывод версии version.v7, не работает на Jelly Bean Установить град для использования в кордове buildroid

Диалоговая проблема: requestFeature () необходимо вызвать перед добавлением содержимого

Я создаю специальный диалог, содержащий EditText, чтобы я мог получать текстовые данные от пользователя:

final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog dialog = keyBuilder.create(); dialog.setTitle("Decryption Failed"); dialog.setContentView(R.layout.decrypt_failed_dialog); dialog.show(); 

Однако я всегда получаю это исключение:

 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181) 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at com.android.internal.app.AlertController.installContent(AlertController.java:199) 01-11 18:49:00.507: ERROR/AndroidRuntime(3461): at android.app.AlertDialog.onCreate(AlertDialog.java:251) ... 

На строке dialog.show() . Что я должен делать, чтобы избавиться от этого?

Solutions Collecting From Web of "Диалоговая проблема: requestFeature () необходимо вызвать перед добавлением содержимого"

Перед созданием диалогового окна вам нужно настроить пользовательский вид. Также вам нужно использовать setView(View) вместо setContentView() если вы используете по умолчанию положительные и отрицательные кнопки, предоставленные вам с помощью AlertDialog .

 final EditText newKey = (EditText) findViewById(R.id.dialog_result); AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); keyBuilder .setCancelable(false) .setPositiveButton("Try Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.v("Dialog","New Key: "+newKey.getText().toString()); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); keyBuilder.setTitle("Decryption Failed"); keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); AlertDialog dialog = keyBuilder.create(); dialog.show(); 

Также убедитесь, что вы не возвращаете уже показанный диалог. Например, ProgressDialog имеет удобный статический метод show() который принимает некоторые параметры и возвращает ProgressDialog . Оказывается, вы не можете использовать этот метод и возвращать полученный ProgressDialog , потому что тогда, когда ОС пытается показать его (и он уже показан), он будет вызывать это же исключение.

Остерегайтесь также: вышеописанное поведение наблюдается в эмуляторе Android, но на самом деле это не вызвало исключение и отлично справилось с моей версией Droid Incredible 2.2.

Я столкнулся с этим примерно год назад и исправил его с помощью странного кода. Опять же, приложение, над которым я работаю, имеет фрагмент, который должен отображаться обычно на телефоне, но в диалоге на планшете. Я решил это так:

 public class MyDialogFragment extends DialogFragment { private View mLayout; private ViewGroup mContainer; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContainer = container; if (getShowsDialog()) { // one could return null here, or be nice and call super() return super.onCreateView(inflater, container, savedInstanceState); } return getLayout(inflater, container); } private View getLayout(LayoutInflater inflater, ViewGroup container) { mLayout = inflater.inflate(R.layout.my_layout, container, false); return mLayout; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getContext()) .setPositiveButton(R.string.ok, null) .setNegativeButton(R.string.cancel, null) .setNeutralButton(R.string.filter_clear_selection, null) .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) .create() ; } } 

Это позволяет мне добавить свой фрагмент как любой нормальный фрагмент (в макете), но также отображать его как диалог, в котором он работает автономно.

Для тех, у кого эта проблема возникает при использовании DialogFragment .

В моем случае это произошло потому, что я неправильно DialogFragment класс DialogFragment . Я возвращал представление onCreateView() И также возвращал пользовательский диалог onCreateDialog() . В документации указано:

У вас может быть дизайн пользовательского интерфейса, в котором вы хотите, чтобы часть пользовательского интерфейса отображалась как диалог в некоторых ситуациях, но как полноэкранный или встроенный фрагмент в других (возможно, в зависимости от того, является ли устройство большим экраном или маленьким экраном). Класс DialogFragment предлагает вам эту гибкость, потому что он все еще может вести себя как встраиваемый фрагмент.

Однако вы не можете использовать AlertDialog.Builder или другие объекты Dialog для построения диалога в этом случае. Если вы хотите, чтобы DialogFragment был встраиваемым, вы должны определить интерфейс диалога в макете, а затем загрузить макет в обратном вызове onCreateView ().

Решила проблему, не создавая ничего на onCreateDialog() (только вернув реализацию суперкласса).

У меня была аналогичная проблема. Но мой диалог должен отображаться для IME. Когда я переключился на Dialog вместо AlertDialog и пропустил create, программа работала для меня.

Точный способ решить эту проблему:

requestFeature(int) – это метод Window . Вы должны импортировать этот класс ( android.view.Window ).

И вы должны получить окно Window объекта AlertDialog.Builder. Затем вызовите requestFeature(int) . Входной параметр является константой окна.

keyBuilder.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);