it-swarm.com.de

requestFeature () muss vor dem Hinzufügen von Inhalt aufgerufen werden

Ich versuche eine benutzerdefinierte Titelleiste zu implementieren:

Hier ist meine Helferklasse:

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

Hier nenne ich es in onCreate ():

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

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

Aber ich bekomme den Fehler:

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

Nun, tun Sie einfach, was die Fehlermeldung Ihnen sagt.

Rufen Sie setContentView() nicht vor requestFeature() auf.

Hinweis:

Wie in Kommentaren gesagt, ist es sowohl für die ActionBarSherlock- als auch für die AppCompat-Bibliothek erforderlich, requestFeature() vor super.onCreate() aufzurufen.

313

Ich weiß, es ist über ein Jahr alt, aber das Anrufen von requestFeature() hat mein Problem nie gelöst. In der Tat nenne ich es überhaupt nicht.

Es war ein Problem mit dem Aufblasen der Ansicht, wie ich vermute. Trotz meiner Suche habe ich nie eine passende Lösung gefunden, bis ich mit den verschiedenen Methoden des Aufblasens einer Ansicht herumgespielt habe.

AlertDialog.Builder ist die einfache Lösung, erfordert jedoch viel Arbeit, wenn Sie diese Sicht mit onPrepareDialog() aktualisieren.

Eine andere Alternative besteht darin, AsyncTask für Dialoge zu nutzen.

Eine letzte Lösung, die ich verwendet habe, ist unten:

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

* Einige zusätzliche Anmerkungen:

  1. Verlassen Sie sich nicht darauf, den Titel zu verbergen. Es ist oft ein leeres Feld vorhanden, obwohl der Titel nicht festgelegt wurde.
  2. Versuchen Sie nicht, Ihre eigene Ansicht mit Kopfzeile und mittlerer Ansicht zu erstellen. Wie oben erwähnt, kann der Header trotz Anforderung von FEATURE_NO_TITLE nicht vollständig ausgeblendet werden.
  3. Gestalten Sie Ihre Inhaltsansicht nicht stark mit Farbattributen oder Textgröße. Lassen Sie den Dialog damit umgehen, andernfalls riskieren Sie, schwarzen Text in einen dunkelblauen Dialog zu setzen, da der Hersteller die Farben invertiert.
22
Cookster

Ich erweiterte ein DialogFragment und die obige Antwort funktionierte nicht. Ich musste getDialog () verwenden, um den Titel zu entfernen:

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

Sagt der Fehler nicht genau, was falsch ist? Sie rufen requestWindowFeature und setFeatureInt auf, nachdem Sie setContentView aufgerufen haben.

Warum rufst du übrigens zweimal setContentView an?

2
EboMike

Ändern Sie die Compile-SDK-Version, Target-SDK-Version in Build Tools-Version in 24.0.0 in build.gradle, wenn in der Funktion Request ein Problem auftritt

1
Jaichander

Bei SDK-Version 23 und höher wird dieselbe RuntimeException ausgelöst, wenn Sie AppCompatActivity verwenden, um Ihre Aktivität zu erweitern. Dies ist nicht der Fall, wenn Ihre Aktivität direkt von der Aktivität stammt.

Dies ist ein bekanntes Problem bei Google, wie in https://code.google.com/p/Android/issues/detail?id=186440 erwähnt.

Die zur Verfügung gestellte Problemumgehung besteht darin, die Methode supportRequestWindowFeature () anstelle von requestFeature () zu verwenden.

Bitte stimmen Sie zu, wenn es Ihr Problem löst.

1
Keshav Bansal

Ich hatte dieses Problem mit Dialogen, die auf einem erweiterten DialogFragment basierten, das auf Geräten mit API 26 einwandfrei funktionierte, aber mit API 23 fehlgeschlagen ist. Die oben genannten Strategien haben nicht funktioniert, aber ich habe das Problem behoben, indem ich die onCreateView-Methode (die durch eine weitere hinzugefügt wurde) entfernt hatte aktuelle Android Studio-Vorlage) aus dem DialogFragment und Erstellen des Dialogs in onCreateDialog.

0
BillC

In meinem Fall habe ich DialogFragment in Activity angezeigt. In diesem Dialogfragment habe ich geschrieben wie in DialogFragment schwarzen Rand entfernen :

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
}

Entfernen Sie entweder setStyle(STYLE_NO_FRAME, 0) in onCreate() oder ändern/entfernen Sie onCreateDialog. Weil sich die Dialogeinstellungen geändert haben, nachdem der Dialog erstellt wurde.

0
CoolMind