2013-08-18 17 views
12

Próbuję wyśrodkować ProgressBar programowo przy użyciu następujących:Centrowanie ProgressBar programowo w Android

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

Rozmiar wydaje się działać dobrze, ale ProgressBar nie wyśrodkować w istniejącym układzie (zdefiniowany przez xml z układem względnym). Czy jest tu coś oczywiście nie tak?

XML jest następujący:

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

znaczy to tylko pusty względny układ do testowania z i zobaczyć, czy mogę dostać to programowo dodać pasek postępu.

Dzięki.

+0

proszę pisać XML :) –

+1

Dlaczego czy starasz się tworzyć programowo, kiedy możesz to osiągnąć w xml? – VenomVendor

+0

Tworzę go jako klasę, ponieważ jest to widok, który chcę dynamicznie wstrzykiwać, kiedy i kiedy w aplikacji zachodzą różne procesy. Robiąc to w ten sposób, nie muszę wstawiać wszystkich układów. Mogę tylko utworzyć instancję jako obiekt i dołączyć do bieżącego układu. –

Odpowiedz

30

Jeśli chcesz to zrobić programowo można to zrobić jak poniżej:

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

Dziękujemy! Powoli zaczynam rozumieć ten biznes Androida. –

+0

W rzeczywistości problem z implementacją polega na użyciu parametrów RelativeLayout w pliku ProgressBar, ale zewnętrzny układ macierzysty w ogóle nie jest relatywnym elementem. Powinieneś umieścić pasek postępu we względnym układzie, aby CENTER_IN_PARENT działał. W innym przypadku po prostu zignoruje. – tasomaniac

+0

To działa dobrze tasomaniac dla nowego układu, ale co jeśli chcę dodać pasek postępu do istniejącego układu zdefiniowanego w xml. Powyższe pokazuje tylko pasek postępu, tj. Nowy układ. thanx. –

8

Użyj kodowania w tym stylu, to daje wynik chcesz.

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

Nie potrzebujesz XML. Można utworzyć widok wszyscy kodem:

@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

napisałem klasę na podstawie @ DharmarajRupakheti na 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); 
    } 
} 

Zastosowanie:

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

To powinien być prawidłowy sposób robienia tego, biorąc pod uwagę fakt, że pasek postępu w pasku narzędzi jest przestarzały – Daniel

+0

Dzięki za odpowiedź, świetny sposób dynamicznego wdrażania ProgressBar –

+0

Wierzę, że to spowoduje wyciek obiektu kontekstu. Będziesz chciał uczynić go WeakReference - lub, ponieważ nie używasz go nawet poza pierwszą metodą, po prostu nie przechowuj w ogóle odniesienia do niego. – kpsharp