2013-08-18 53 views
12

我試圖居中ProgressBar編程方式使用下列內容:居中進度編程中的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); 

的大小設置似乎工作正常,但ProgressBar不會在現有佈局中心(由定義XML與相對佈局)。這裏有什麼明顯的錯誤嗎?

的XML如下:

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

即它只是一個空的相對佈局,以測試與,看看我能得到它以編程方式添加一個進度條。

謝謝。

+0

請張貼的XML :) –

+1

爲什麼你需要努力以編程方式創建,何時可以在xml中實現它? – VenomVendor

+0

我將它創建爲一個類,因爲它是我想要在應用程序中發生不同進程時動態注入的視圖。這樣做意味着我不必把所有的佈局。我可以將它實例化爲一個對象並將其附加到當前佈局。 –

回答

30

如果你想以編程方式做到這一點,你可以像下面:

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

謝謝!我正在慢慢開始瞭解這個Android業務。 –

+0

實際上,您的實現中的問題是您在ProgressBar中使用RelativeLayout參數,但外層父佈局根本不是RelativeLayout。您應該按照CENTER_IN_PARENT的順序將進度條放入相對佈局中。否則它會被忽略。 – tasomaniac

+0

對於新的佈局來說,這非常適合tasomaniac,但是如果我想將進度條附加到在xml中定義的現有佈局,該怎麼辦。以上只顯示了進度條,即它是一個新的佈局。感謝名單。 –

8

使用您的編碼,這種風格,這給你想要的結果。

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

您不需要XML。您可以通過代碼的所有創建視圖:

@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

我寫了基於@類DharmarajRupakheti的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); 
    } 
} 

用法:

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

這應該是正確的方式做這件事考慮到進度條在工具欄中已被棄用 – Daniel

+0

感謝您的回答,動態實現ProgressBar的好方法 –

+0

我相信這會泄漏上下文對象。你會希望使它成爲一個WeakReference--或者,因爲你甚至沒有在第一個方法之外使用它,所以根本不要存儲它的引用。 – kpsharp