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
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()
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:
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);
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?
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
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.
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.
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.