3
votes

Android ProgressBar disparaît

J'ai une barre de progression android qui est indéterminée, il s'agit donc simplement d'une animation de cercle tournant.

Il commence à s'afficher correctement, mais après avoir défini la visibilité de son parent ( overlayLayout ) sur l'un ou l'autre disparu ou invisible, puis redéfinissez-le sur visible plus tard, la barre de progression est invisible?

private void OnGpsUpdate()
{
    overlay.Visibility = ViewStates.Gone;
}

private void NoGPS()
{
    description.Text = "Waiting for GPS";
    overlay.Visibility = ViewStates.Visible;
}

MODIFIER: Je ne sais pas si la vue est incluse mais la barre de progression n'est tout simplement pas rendue ou si la vue ProgressBar elle-même est complètement exclue car je ne peux pas accéder à la hiérarchie des vues de l'interface utilisateur.

Jusqu'à présent, j'ai essayé:

overlay = new RelativeLayout(mainActivity)
{
    LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent)
};
overlay.SetBackgroundColor(Color.WhiteSmoke);
overlay.SetGravity(GravityFlags.Center);
description = new TextView(mainActivity)
{
    LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent),
    Gravity = GravityFlags.Center,
    TextSize = 18,
    Id = 1523112
};
description.Text = "Waiting for GPS";
description.SetBackgroundColor(Color.Aqua);
progressBar = new ProgressBar(mainActivity)
{
    Indeterminate = true,
};
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
lp.AddRule(LayoutRules.Below, description.Id);
progressBar.LayoutParameters = lp;
progressBar.SetBackgroundColor(Color.Red);

container.AddView(overlay);
overlay.AddView(description);
overlay.AddView(progressBar);

Mais je n'ai pas encore fait de percée.

MODIFIER 2: Merci à tous pour votre aide jusqu'à présent. Je suis passé à la création de la mise en page par programme - voici mon code complet:

    ProgressBar.Enabled = true;
    ProgressBar.ForceLayout();
    ProgressBar.Invalidate();
    ProgressBar.SetProgress(0, true);
    ProgressBar.Visibility = ViewStates.Visible;

Avec les deux méthodes de masquage et d'affichage:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/overlayLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:gravity="center" >
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:textAlignment="center"
        android:layout_margin="10dp"
        android:layout_height="wrap_content"
        android:id="@+id/overlayLabelText" />
  <ProgressBar
      android:id="@+id/overlayProgressBar"
      android:layout_below="@id/overlayLabelText"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:foregroundGravity="center"
      android:indeterminate="true" />
</RelativeLayout>

Lors du premier rendu de la mise en page, avant d'être masquée pour la première fois:
(J'ai fait une capture d'écran à un mauvais moment, mais le dessin bleu montre où le cercle se déplace autour de son animation de chargement) entrez la description de l'image ici

Une fois qu'elle a été masquée et affichée à nouveau, la vue de chargement progressBar est là mais il n'y a plus de cercle de chargement:

entrez image description here

Je commence à penser que c'est peut-être juste un problème avec mon émulateur Android? Non, même problème lors des tests sur mon téléphone physique. L'affichage texte est toujours correct, c'est juste la barre de progression qui ne s'affiche pas?

SOLUTION Je ne comprends pas tout à fait cela, car tout le reste semblait fonctionner à l'exception de progressBar, mais une solution est venue d'envelopper mes appels de visibilité dans un appel RunOnUIThread ().


6 commentaires

Quel est le code que vous utilisez pour afficher / masquer la vue parent overlayLayout ? Pourriez-vous mettre à jour le message d'origine avec ce qui précède?


oui ça l'est et ça devrait être comme ça ProgressBar.Visibility = View.VISIBLE; ou ProgressBar.Visibility = View.GONE;


Je vous suggère de poster plus de détails sur votre code. Afin que nous puissions le tester pour vous.


Avez-vous résolu ce problème?


@AbbyWang Oui, je vous remercie! La solution consistait à ajouter un wrapper RunOnUiThread () pour les appels d'interface utilisateur.


@Moffen OK, désolé je n'ai pas remarqué ça.


4 Réponses :


0
votes

pour masquer la mise en page:

findViewById(R.id.overlayLayout).setVisibility(View.VISIBLE);

pour l'afficher à nouveau:

findViewById(R.id.overlayLayout).setVisibility(View.GONE);


0 commentaires

2
votes

Quelques points

En fonction de la manière dont le problème a été décrit, vous devez afficher l'extrait de code que vous avez utilisé pour masquer / afficher le overlayLayout

Recommandations

Si vous êtes uniquement préoccupé par le comportement de la barre de progression en termes de masquage / affichage, cet extrait de code n'est pas nécessaire: p>

private RelativeLayout overlayLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_example);

    // Instantiate the layout
    overlayLayout = findViewById(R.id.overlayLayout);

    // Do the logic how you inflate/show the layout
    ... 

    // Hide the overlay layout
    overlayLayout.setVisibility(View.GONE);

    // Show the overlay layout
    overlayLayout.setVisibility(View.VISIBLE);
}

Il vous suffit de contrôler la disposition racine qui a l'id de overlayLayout

ProgressBar.Enabled = true;
ProgressBar.ForceLayout();
ProgressBar.Invalidate();
ProgressBar.SetProgress(0, true);
ProgressBar.Visibility = ViewStates.Visible;

Décidez sur la valeur de visibilité, pour ce scénario, je recommanderais View.GONE plutôt que View.INVISIBLE

En savoir plus sur:


1 commentaires

Salut @joshuadeguzman merci pour votre aide jusqu'à présent! J'ai ajouté quelques informations supplémentaires à la question



1
votes

J'ai écrit une démo basée sur votre code. Et pour le tester, j'ai ajouté un bouton pour contrôler l'affichage et le masquage de la mise en page. Vous pouvez essayer ceci:

protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
            // Instantiate the layout
            overlayLayout =  FindViewById<LinearLayout>(Resource.Id.overlayLayout);
            progressBar =  FindViewById<ProgressBar>(Resource.Id.overlayProgressBar);
            description = FindViewById<TextView>(Resource.Id.textView1);
            description.Text = "Waiting for GPS";
            description.SetBackgroundColor(Color.Aqua);
            progressBar.SetBackgroundColor(Color.Red);

            switchBtn = FindViewById<Button>(Resource.Id.switchButton);

            switchBtn.Click += SwitchBtn_Click;
            overlayLayout.Visibility = Android.Views.ViewStates.Visible;
            isShown = true;
        }

        private void SwitchBtn_Click(object sender, System.EventArgs e)
        {
            if (isShown)
            {
                overlayLayout.Visibility = Android.Views.ViewStates.Gone;
                isShown = false;
                switchBtn.Text = "Show";
            }
            else {
                overlayLayout.Visibility = Android.Views.ViewStates.Visible;
                isShown = true;
                switchBtn.Text = "Hide";
            }

Vous pouvez télécharger la démo sur ceci a >


2 commentaires

Salut @AbbyWang J'ai ajouté quelques détails supplémentaires, merci pour votre aide jusqu'à présent!


J'ai modifié ma démo en fonction de votre code, cela fonctionne toujours bien. Si cela vous convient, pourriez-vous partager votre projet complet ou votre démo? Pour que nous puissions résoudre votre problème.



1
votes

La solution était d'ajouter un RunOnUIThread comme ceci:

private void OnNewGPS()
{
    mainActivity.RunOnUiThread(() =>
    {
        overlay.Visibility = ViewStates.Gone;     });
}

private void NoGPS()
{
    mainActivity.RunOnUiThread(() =>
    {
        overlay.Visibility = ViewStates.Visible;
    });
}

Où mainActivity est une référence à l'activité dans laquelle les vues s'exécutent.


0 commentaires