web-dev-qa-db-fra.com

requestFeature () doit être appelé avant d'ajouter du contenu

J'essaie d'implémenter une barre de titre personnalisée:

Voici ma classe d'assistance:

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);
        }
    }
}

Voici où je l'appelle dans onCreate ():

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

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

Mais je reçois l'erreur:

requestFeature() must be called before adding content
127
Sheehan Alam

Eh bien, faites ce que le message d'erreur vous dit.

N'appelez pas setContentView() avant requestFeature().

Remarque:

Comme indiqué dans les commentaires, pour les bibliothèques ActionBarSherlock et AppCompat, il est nécessaire d'appeler requestFeature() avant super.onCreate()

313
Octavian Damiean

Je sais que cela fait plus d'un an, mais appeler requestFeature() n'a jamais résolu mon problème. En fait je n'appelle pas ça du tout.

C'était un problème avec gonfler la vue, je suppose. Malgré toutes mes recherches, je n'ai jamais trouvé de solution adéquate avant de jouer avec les différentes méthodes pour gonfler une vue.

AlertDialog.Builder est la solution facile, mais nécessite beaucoup de travail si vous utilisez la fonction onPrepareDialog() pour mettre à jour cette vue.

Une autre alternative consiste à utiliser AsyncTask pour les dialogues.

Une solution finale que j'ai utilisée est ci-dessous:

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() );
       // ...
   }
}

* Quelques notes supplémentaires:

  1. Ne comptez pas cacher le titre. Il y a souvent un espace vide même si le titre n'est pas défini.
  2. N'essayez pas de créer votre propre vue avec le pied de page d'en-tête et la vue centrale. Comme indiqué ci-dessus, l'en-tête peut ne pas être entièrement masqué malgré la demande de FEATURE_NO_TITLE.
  3. N'appliquez pas de style à votre vue de contenu avec des attributs de couleur ou une taille de texte. Sinon, vous risquez de mettre du texte noir dans une boîte de dialogue bleu foncé, car le fournisseur a inversé les couleurs.
22
Cookster

J'étendais un DialogFragment et la réponse ci-dessus ne fonctionnait pas. Je devais utiliser getDialog () pour supprimer le titre:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
10
Illegal Argument

L'erreur ne vous dit-elle pas ce qui ne va pas? Vous appelez requestWindowFeature et setFeatureInt après avoir appelé setContentView.

Au fait, pourquoi appelez-vous setContentView deux fois?

2
EboMike

Remplacez la version Compile SDK, Target SDK par Build Tools version par 24.0.0 dans build.gradle si vous rencontrez un problème dans la demande

1
Jaichander

Pour les versions 23 et ultérieures du SDK, la même exception RuntimeException est levée si vous utilisez AppCompatActivity pour étendre votre activité. Cela ne se produira pas si votre activité provient directement d’Activité.

C’est un problème connu sur Google mentionné dans https://code.google.com/p/Android/issues/detail?id=186440

La solution consiste à utiliser la méthode supportRequestWindowFeature () au lieu de requestFeature ().

S'il vous plaît upvote si cela résout votre problème.

1
Keshav Bansal

J'ai eu ce problème avec Dialogs basé sur un DialogFragment étendu qui fonctionnait bien sur les périphériques exécutant l'API 26 mais échouait avec l'API 23. Les stratégies ci-dessus ne fonctionnaient pas, mais j'ai résolu le problème en supprimant la méthode onCreateView (qui avait été ajoutée plus tard). modèle Android Studio récent) à partir de DialogFragment et créer la boîte de dialogue dans onCreateDialog.

0
BillC

Dans mon cas, j'ai indiqué DialogFragment sur Activity. Dans ce fragment de dialogue, j’ai écrit comme dans DialogFragment remove black border :

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
}

Supprimez setStyle(STYLE_NO_FRAME, 0) dans onCreate() ou modifiez/supprimez onCreateDialog. Parce que les paramètres de la boîte de dialogue ont été modifiés après sa création.

0
CoolMind