2015-12-19 78 views
0

在我的android應用程序中,我有兩個以編程方式生成的按鈕和按鈕在佈局文件中設計。保持consitent android造型

我的問題是確保我的程序生成的按鈕匹配佈局文件中的按鈕的最佳方法是什麼?

主要方法:

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

    Button subButton = new Button(getApplicationContext()); 

    subButton.setText("-"); 
    TableRow.LayoutParams lp2 = new TableRow.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT); 
    subButton.setLayoutParams(lp2); 

    LinearLayout container = (LinearLayout) findViewById(R.id.container); 

    container.addView(subButton); 

} 

佈局文件:

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="-" 
     android:id="@+id/addButton" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/container" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

</RelativeLayout> 

在這個例子中的兩個按鈕似乎是不同的。

編輯:

兩個按鈕之間的差異是高度和寬度。我試圖通過簡化按鈕來最小化參數的差異。

編輯2:

Picture of the XML button compared to the Generated button.

+0

你的形象讓我相信@ihanhanniballake的回答是正確的。試試AppCompatButton subButton = new AppCompatButton(this);'。 – MeetTitan

回答

0

我建議使用factory method來解決這個問題。

實現工廠方法與定義構造對象的方法一樣簡單,並在將其返回給您之前添加必需字段。這減少了許多鍋爐板碼。另外,您正在使用RelativeLayout的佈局元素,所以我將向您展示一個接收RelativeLayout作爲其容器的方法。如果你真的在使用LinearLayout(或其他的!),我們必須偏離你的佈局參數才能獲得相同的外觀。

一個合適的例子:

public Button getNewStyledButton(String text) { 
    Button button = new Button(this); 
    button.setText(text); 
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); 
    button.setLayoutParams(layoutParams); 
    return button; 
} 

然後,每當我們需要一個風格的按鈕,它是那樣簡單調用:

yourRelativeLayout.addView(getNewStyledButton("-")); //replace "-" with your desired text. You can also pass a `Runnable` as an argument for the button callback. 

讓我知道如果這能幫助你,如果你需要幫助與你的LinearLayout一樣。

+0

謝謝,這似乎是方法生成按鈕的最佳方法。這與使用button_style.xml的@joshgoldeneagle建議相結合。我將創建一個關於爲什麼生成的按鈕和佈局按鈕顯示不同的新問題。 – user3610520

+0

嘗試ianhanniballake的建議,並用我提供的工廠方法包裝它,你會變得金黃。 – MeetTitan

0

使用活動上下文來代替:

Button subButton = new Button(this); // not getApplicationContext() 
+0

這不會使兩個按鈕完全相同。 – user3610520

+0

@ user3610520他們還有什麼不同?如果您在XML中的按鈕上有任何屬性,則必須在您的java代碼中進行等效修改。請更新您的問題以更具體地瞭解不同之處,但無論如何您都需要使用活動上下文而不是應用程序上下文。 – Karakuri

1

如果您正在使用AppCompatActivity,你需要使用AppCompatButton而不是Button。正如在Support Library 22.1 blog post中所解釋的那樣,當您使用XML定義標準小部件時,標準小部件將自動替換爲它們的AppCompat等價物,以確保所有API級別的樣式一致,但對於程序使用,您必須手動確保使用AppCompat版本。

+0

謝謝!這正是導致兩個按鈕之間差異的原因。 – user3610520

0

創建這樣一個button_style.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

<item> 
<shape> 
<gradient android:startColor="#449def" android:endColor="#2f6699" android:angle="270" /> 
<stroke android:width="1dp" android:color="#2f6699" /> <corners android:radius="4dp" /> 
<padding android:left="10dp" android:top="10dp" android:right="10dp" 
android:bottom="10dp" /> 
</shape> 
</item> 

</selector> 

然後以編程方式應用這種風格到您的按鈕:

Button mybutton = new Button(this); 
    mybutton.setText("Test Example"); 
    mybuttonsetId(R.string.myButton); 
    myButton.setBackgroundResource(R.layout.buttonstyle); 

對於XML創建的按鈕直接一定要還引用了相同的風格:

 <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@layout/buttonstyle" 
     />