Android: modifiez la vue de titre personnalisée au moment de l'exécution

J'utilise une vue de titre personnalisée dans ma demande pour chaque activité. Dans l'une des activités, en fonction des clics de bouton, je dois modifier la vue de titre personnalisée. Maintenant, cela fonctionne bien à chaque fois que je fais un appel pour réglerFeatureInt.

Mais si j'essaie de mettre à jour tous les éléments du titre personnalisé (par exemple modifier le texte d'un bouton ou une vue de texte sur le titre), la mise à jour ne se fait pas.

  • Android.view.InflateException: ligne de fichier XML n ° 12: erreur de classe de gonflage <inconnu>
  • Exception de la mauvaise annulation du gestionnaire de fenêtres
  • Les fuites de mémoire dans l'application Android
  • Comment annuler le bouton de la caméra de Google Glass
  • Android Custom Widget Inflate Exception
  • Com.google.android.gms.auth.GoogleAuthException: Inconnu
  • Le débogage à travers le code montre que les instances de texte et de bouton ne sont pas nulles et je peux également voir la barre de titre personnalisée. Mais le texte sur la vue du texte ou le bouton n'est pas mis à jour. Est-ce que quelqu'un d'autre a fait face à ce problème? Comment puis-je le résoudre?

    Merci.

    MODIFIER

    Voici ce que j'ai essayé. Ne peut pas être mis à jour même lors de l'affichage de l'appel.

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title); TextView databar = (TextView) findViewById(R.id.title_text); databar.setText("Some Text"); databar.postInvalidate(); Button leftButton = (Button) findViewById(R.id.left_btn); leftButton.setOnClickListener(mLeftListener); leftButton.setText("Left Btn"); leftButton.postInvalidate(); Button rightBtn = (Button) findViewById(R.id.right_btn); rightBtn.setOnClickListener(mRightListener); rightBtn.postInvalidate(); 

  • Comment obtenir l'adresse e-mail principale de l'appareil Android
  • Faire défiler une galerie permet l'état pressé et supprime l'écouteur de clics des sous-éléments
  • Comment supprimer la flèche HomeAsUpButton de ActionBar Sherlock?
  • Les bibliothèques de support Android 23.2.0 provoquent une chute de l'application
  • Pas d'ID pour mon test d'interface utilisateur
  • Comment obtenir une sonnerie actuelle dans Android?
  • 4 Solutions collect form web for “Android: modifiez la vue de titre personnalisée au moment de l'exécution”

    Le problème est que la seule implémentation de Window ( PhoneWindow ) utilise un LayoutInflater dans sa méthode setFeatureInt et instancie la nouvelle mise en page avec inflate et attachToRoot=true . Par conséquent, lorsque vous appelez setFeatureInt , les nouvelles mises en page ne sont pas remplacées mais attachées au conteneur de titre interne et donc dessiné l'un sur l'autre.

    Vous pouvez contourner cela en utilisant la méthode helper suivante au lieu de setFeatureInt . L'assistant supprime simplement toutes les vues du conteneur de titre interne avant que la nouvelle fonction de titre personnalisé soit définie:

     private void setCustomTitleFeatureInt(int value) { try { // retrieve value for com.android.internal.R.id.title_container(=0x1020149) int titleContainerId = (Integer) Class.forName( "com.android.internal.R$id").getField("title_container").get(null); // remove all views from titleContainer ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews(); // add new custom title view getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value); } catch(Exception ex) { // whatever you want to do here.. } } 

    Je ne suis pas sûr de savoir si le comportement setFeatureInt actuel est destiné, mais ce n'est certainement pas documenté d'une manière ou d'une autre, c'est pourquoi je vais prendre cela sur les développeurs Android;)

    MODIFIER

    Comme indiqué dans les commentaires, la solution de contentieux susmentionnée n'est pas idéale. Au lieu de compter sur la constante com.android.internal.R.id.title_container vous pouvez simplement cacher l'ancien titre personnalisé chaque fois que vous définissez un nouveau.

    Supposons que vous avez deux mises en page de titre personnalisées:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/custom_title_1" ... 

    et

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/custom_title_2" ... 

    Et vous souhaitez remplacer custom_title_1 par custom_title_2 , vous pouvez cacher l'ancien et utiliser setFeatureInt pour ajouter ce dernier:

     findViewById(R.id.custom_title_1).setVisibility(View.GONE); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_2); 

    La façon correcte de le faire est la suivante:

     requestWindowFeature( Window.FEATURE_CUSTOM_TITLE ); setContentView( R.layout.my_layout ); getWindow().setFeatureInt( Window.FEATURE_CUSTOM_TITLE, R.layout.my_custom_title ); super.onCreate( savedInstanceState ); 

    Veuillez noter que l'ordre de ces déclarations est très important.

    Si vous appelez super.onCreate () avant l'une des autres déclarations, vous obtiendrez une barre de titre vierge, que le piratage de trouver l'ID de la barre de titre et de supprimer toutes les vues à partir de celle-ci réparera, mais n'est pas recommandé.

    Appelez-vous invalidate ou postInvalidate pour redessiner la vue après la mise à jour du texte? Si c'est une vue personnalisée, pouvez-vous mettre un point d'arrêt dans le code du tirage pour vous assurer qu'il est appelé?

    Si vous êtes sur le thread UI, vous pouvez appeler «invalider» si vous n'êtes pas, vous devez appeler «postInvalidate» ou la vue ne se redessinera pas.

    Juste ma valeur 2c:

    Lorsque vous travaillez dans un MapActivity, demander un titre personnalisé n'a donné aucun titre.

    Heureusement, tout ce que je voulais faire était de régler le texte du titre différemment, et je me suis rendu compte qu'il suffit d'appeler setTitle () à l'intérieur de onCreate () pour moi (je l'ai appelé après que j'ai appelé setContentView ())

    Désolé, mais je n'ai plus le temps de décomposer cela et de comprendre pourquoi ce que je faisais ne fonctionnait pas, et pourquoi il était nécessaire de le changer. Comme je l'ai dit, je pensais que cela pourrait aider quelqu'un sur la route.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.