2013-08-18 6 views
12
Programmatically

J'essaie de centrer une ProgressBar par programmation les éléments suivants:Centrage ProgressBar dans Android

ViewGroup layout = (ViewGroup) findViewById(android.R.id.content).getRootView(); 
progressBar = newProgressBar(SignInActivity.this,null,android.R.attr.progressBarStyleLarge); 
progressBar.setIndeterminate(true); 
progressBar.setVisibility(View.VISIBLE); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100,100); 
params.addRule(RelativeLayout.CENTER_IN_PARENT); 
layout.addView(progressBar,params); 

Le paramètre de taille semble fonctionner bien, mais le ProgressBar ne centre pas dans la mise en page existante (définie par xml avec une disposition relative). Est-ce qu'il y a quelque chose qui cloche ici?

Le XML est la suivante:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".test" 
android:typeface="monospace"> 

</RelativeLayout> 

à-dire qu'il est juste un vide par rapport à la mise en page test avec et voir si je peux l'obtenir pour ajouter un programme barre de progression.

Merci.

+0

S'il vous plaît publier le XML :) –

+1

Pourquoi vous prenez l'effort de créer par programme, quand vous pouvez l'obtenir en XML? – VenomVendor

+0

Je le crée en tant que classe car c'est une vue que je veux injecter dynamiquement au fur et à mesure que différents processus sont en cours dans l'application. Le faire de cette façon signifie que je n'ai pas à mettre dans toutes les dispositions. Je peux simplement l'instancier en tant qu'objet et l'ajouter à la mise en page actuelle. –

Répondre

30

Si vous voulez le faire, vous pouvez le faire comme programatically ci-dessous:

RelativeLayout layout = new RelativeLayout(this); 
progressBar = new ProgressBar(SignInActivity.this,null,android.R.attr.progressBarStyleLarge); 
progressBar.setIndeterminate(true); 
progressBar.setVisibility(View.VISIBLE); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100,100); 
params.addRule(RelativeLayout.CENTER_IN_PARENT); 
layout.addView(progressBar,params); 

setContentView(layout); 
+0

Merci! Je commence lentement à comprendre cette entreprise Android maintenant. –

+0

En fait, le problème avec votre implémentation est que vous utilisez les paramètres RelativeLayout dans votre ProgressBar mais la mise en page parent externe n'est pas du tout RelativeLayout. Vous devez placer la barre de progression dans une disposition relative pour que CENTER_IN_PARENT fonctionne. Sinon, il sera simplement ignoré. – tasomaniac

+0

Cela fonctionne bien tasomaniac pour une nouvelle mise en page, mais que faire si je veux ajouter la barre de progression à une disposition existante définie en xml. Ce qui précède ne montre que la barre de progression, c'est-à-dire une nouvelle disposition. merci. –

8

Utilisez votre codage dans ce style, cela donne le résultat que vous voulez.

ViewGroup layout = (ViewGroup) findViewById(android.R.id.content).getRootView(); 

progressBar = new ProgressBar(thisActivity,null,android.R.attr.progressBarStyleLarge); 
progressBar.setIndeterminate(true); 
progressBar.setVisibility(View.VISIBLE); 

RelativeLayout.LayoutParams params = new 
     RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT); 

RelativeLayout rl = new RelativeLayout(thisActivity); 

rl.setGravity(Gravity.CENTER); 
rl.addView(progressBar); 

layout.addView(rl,params); 
0

Vous n'avez pas besoin du code XML. Vous pouvez créer la vue tous par code:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout layout = new LinearLayout(this); 
     ProgressBar pb = new ProgressBar(this, null, 
             android.R.attr.progressBarStyleLarge); 
     ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     pb.setLayoutParams(params); 
     layout.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); 
     layout.addView(pb); 
     setContentView(layout); 
} 
28

J'ai écrit une classe basée sur @answer de DharmarajRupakheti:

public class ProgressBarHandler { 
    private ProgressBar mProgressBar; 
    private Context mContext; 

    public ProgressBarHandler(Context context) { 
     mContext = context; 

     ViewGroup layout = (ViewGroup) ((Activity) context).findViewById(android.R.id.content).getRootView(); 

     mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge); 
     mProgressBar.setIndeterminate(true); 

     RelativeLayout.LayoutParams params = new 
       RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 

     RelativeLayout rl = new RelativeLayout(context); 

     rl.setGravity(Gravity.CENTER); 
     rl.addView(mProgressBar); 

     layout.addView(rl, params); 

     hide(); 
    } 

    public void show() { 
     mProgressBar.setVisibility(View.VISIBLE); 
    } 

    public void hide() { 
     mProgressBar.setVisibility(View.INVISIBLE); 
    } 
} 

Utilisation:

mProgressBarHandler = new ProgressBarHandler(this); // In onCreate 
mProgressBarHandler.show(); // To show the progress bar 
mProgressBarHandler.hide(); // To hide the progress bar 
+1

Cela devrait être la bonne façon de le faire compte tenu du fait que progressBar dans la barre d'outils est obsolète – Daniel

+0

Merci pour la réponse, excellente façon d'implémenter ProgressBar dynamiquement –

+0

Je crois que cela va fuir l'objet Context. Vous voudrez en faire un WeakReference - ou, puisque vous ne l'utilisez même pas en dehors de la première méthode, ne stockez pas du tout de référence. – kpsharp