2013-08-18 15 views
12

Ich versuche, ein ProgressBar programmatisch 'mit dem folgenden:Centering ProgressBar Programmatically in 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); 

Die Größe Einstellung scheint in Ordnung zu arbeiten, aber die ProgressBar nicht Zentrieren nicht in das bestehende Layout (definiert durch XML mit einem relativen Layout). Ist hier etwas offensichtlich falsch?

Die XML ist wie folgt:

<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> 

das heißt, es ist nur ein leeres relatives Layout mit zu testen und sehen, ob ich es programmatisch einen Fortschrittsbalken in dem bekommen kann.

Danke.

+0

Bitte senden Sie das XML :) –

+1

Warum tun Sie nehmen sich Mühe, programmatisch zu erstellen, wenn Sie es in XML erreichen können? – VenomVendor

+0

Ich erstelle es als eine Klasse, da es eine Ansicht ist, die ich dynamisch einfügen möchte, wenn verschiedene Prozesse in der Anwendung stattfinden. Auf diese Weise muss ich nicht alle Layouts einfügen. Ich kann es einfach als Objekt instantiieren und an das aktuelle Layout anhängen. –

Antwort

30

Wenn Sie es programmatisch tun wollen Sie es wie unten tun können:

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

Danke! Ich beginne langsam, dieses Android-Geschäft jetzt zu verstehen. –

+0

Eigentlich das Problem mit Ihrer Implementierung ist, dass Sie RelativeLayout Parameter in Ihrer ProgressBar verwenden, aber das äußere Eltern Layout ist kein RelativeLayout überhaupt. Sie sollten den Fortschrittsbalken in ein relatives Layout einfügen, damit CENTER_IN_PARENT funktioniert. Ansonsten wird es einfach ignoriert. – tasomaniac

+0

Das funktioniert gut tasomaniac für ein neues Layout, aber was ist, wenn ich den Fortschrittsbalken an ein bestehendes Layout anhängen möchte, das in XML definiert ist. Das obige zeigt nur den Fortschrittsbalken, d. H. Es ist ein neues Layout. Danke. –

8

Verwenden Sie Ihre Codierung in diesem Stil, gibt dies das gewünschte Ergebnis.

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

Sie benötigen das XML nicht. Sie können die alle von Code erstellen:

@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

Ich schrieb eine Klasse basierend auf @ DharmarajRupakheti der answer:

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

Verbrauch:

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

Dies sollte die richtige Art und Weise es angesichts der Tatsache sein, dass progressBar in Toolbar veraltet ist – Daniel

+0

Danke für die Antwort, gute Möglichkeit, ProgressBar dynamisch zu implementieren –

+0

Ich glaube, das wird das Context-Objekt. Sie sollten es zu einer WeakReference machen - oder, da Sie es nicht einmal außerhalb der ersten Methode verwenden, speichern Sie einfach keine Referenz darauf. – kpsharp

Verwandte Themen