requestFeature () должен быть вызван перед добавлением контента - PullRequest
133 голосов
/ 22 ноября 2010

Я пытаюсь реализовать пользовательский заголовок:

Вот мой класс помощника:

import android.app.Activity;
import android.view.Window;

public class UIHelper {
    public static void setupTitleBar(Activity c) {
        final boolean customTitleSupported = c.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

        c.setContentView(R.layout.main);

        if (customTitleSupported) {
            c.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }
    }
}

Вот где я вызываю его в onCreate ():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupUI();
}

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}

Но я получаю ошибку:

requestFeature() must be called before adding content

Ответы [ 8 ]

323 голосов
/ 23 ноября 2010

Ну, просто сделайте то, что говорит вам сообщение об ошибке.

Не звоните setContentView() до requestFeature().

Примечание:

Как сказано в комментариях, для библиотек ActionBarSherlock и AppCompat необходимо вызвать requestFeature() до super.onCreate()

23 голосов
/ 13 декабря 2011

Я знаю, что ему больше года, но звонок requestFeature() никогда не решал мою проблему.На самом деле я не называю это вообще.

Это была проблема с надуванием представления, я полагаю.Несмотря на все мои поиски, я так и не нашел подходящего решения, пока не поигрался с различными методами надувания вида.

AlertDialog.Builder - простое решение, но требует большой работы, если вы используете onPrepareDialog()чтобы обновить это представление.

Еще одна альтернатива - использовать AsyncTask для диалогов.

Ниже приводится окончательное решение, которое я использовал:

public class CustomDialog extends AlertDialog {

   private View content;

   public CustomDialog(Context context) {
       super(context);

       LayoutInflater li = LayoutInflater.from(context);
       content = li.inflate(R.layout.custom_view, null);

       setUpAdditionalStuff(); // do more view cleanup
       setView(content);           
   }

   private void setUpAdditionalStuff() {
       // ...
   }

   // Call ((CustomDialog) dialog).prepare() in the onPrepareDialog() method  
   public void prepare() {
       setTitle(R.string.custom_title);
       setIcon( getIcon() );
       // ...
   }
}

* Некоторые дополнительныепримечания:

  1. Не полагайтесь на сокрытие названия.Часто там есть пустое место, несмотря на то, что заголовок не задан.
  2. Не пытайтесь создать свой собственный вид с нижним колонтитулом и средним видом.Заголовок, как указано выше, может не быть полностью скрытым, несмотря на запрос FEATURE_NO_TITLE.
  3. Не используйте в качестве стиля представление содержимого с помощью цветовых атрибутов или размера текста.Позвольте диалогу справиться с этим, иначе вы рискуете поместить черный текст в темно-синий диалог, потому что поставщик инвертировал цвета.
11 голосов
/ 23 июня 2014

Я расширяю DialogFragment , и приведенный выше ответ не сработал. Мне пришлось использовать getDialog (), чтобы добиться удаления заголовка:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
2 голосов
/ 23 ноября 2010

Разве ошибка не говорит точно, что не так? Вы звоните requestWindowFeature и setFeatureInt после того, как звоните setContentView.

Кстати, почему вы звоните setContentView дважды?

1 голос
/ 29 июля 2016

Изменение версии Compile SDK , Целевая версия SDK на Версия инструментов сборки на 24.0.0 в сборкеgradle , если вы столкнулись с проблемой в запросе

1 голос
/ 07 июля 2016

Для SDK версии 23 и выше выдается то же исключение RuntimeException, если вы используете AppCompatActivity для расширения своей активности. Этого не произойдет, если ваша деятельность будет напрямую связана с деятельностью.

Это известная проблема в Google, упомянутая в https://code.google.com/p/android/issues/detail?id=186440

Обходное решение, предусмотренное для этого, заключается в использовании метода supportRequestWindowFeature () вместо запроса requestFeature ().

Пожалуйста, подтвердите, если это решит вашу проблему.

0 голосов
/ 19 декабря 2018

У меня была эта проблема с диалогами на основе расширенного DialogFragment, который отлично работал на устройствах с API 26, но не работал с API 23. Вышеуказанные стратегии не сработали, но я решил проблему, удалив метод onCreateView (который был добавленболее поздним шаблоном Android Studio) из DialogFragment и созданием диалога в onCreateDialog.

0 голосов
/ 09 октября 2018

В моем случае я показал DialogFragment в Activity. В этом фрагменте диалога я написал как DialogFragment удалить черную рамку :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_FRAME, 0)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val dialog = Dialog(context!!, R.style.ErrorDialogTheme)
    val inflater = LayoutInflater.from(context)
    val view = inflater.inflate(R.layout.fragment_error_dialog, null, false)
    dialog.setTitle(null)
    dialog.setCancelable(true)
    dialog.setContentView(view)
    return dialog
}

Либо удалить setStyle(STYLE_NO_FRAME, 0) in onCreate(), либо изменить / удалить onCreateDialog. Поскольку настройки диалога изменились после его создания.

...