以编程方式创build一个特定风格的Android视图

其他问题说,风格不能以编程方式设置,但可以使用样式来初始化 View ,例如从XML加载时。

我怎样才能以编程方式初始化一个View (而不是XML)? 我尝试使用视图(上下文上下文,属性attrs,诠释defStyle) ,但我不知道该parsing什么第二个参数。 在View传递null结果不被显示

Solutions Collecting From Web of "以编程方式创build一个特定风格的Android视图"

AttributeSet包含在xml中指定的属性列表(例如layout_width,layout_height等)。

如果你将它作为null传递,那么你应该明确地设置视图的高度/宽度。

我有同样的问题,但还没有find任何实际的方式,以编程方式直接设置风格,到目前为止。 我想填充我的屏幕上的许多小部件,给定types,让我们说button。 在布局文件中定义它们是不切实际的。 我想以编程方式创build它们,但我也想在样式xml文件中定义它们的样式。

我devise的解决scheme是只在布局文件中定义其中一个小部件,以编程方式创build所有其他小部件,并将样式信息从第一个文件复制到其他文件。

一个例子如下。

在样式文件中,定义button的样式。 例如:

 <style name="niceButton"> <item name="android:layout_width">160dip</item> <item name="android:layout_height">60dip</item> <item name="android:gravity">center</item> <item name="android:textSize">18dip</item> <item name="android:textColor">#000000</item> </style> 

然后通过派生类“NiceButton”子类“Button”。 定义inflater将需要的构造函数:

 public NiceButton(Context context, AttributeSet attrs) { super(context, attrs); } 

然后定义另一个构造函数,其目的是克隆现有的button:

 public NiceButton(int id, NiceButton origButton) { super(origButton.getContext()); setId(id); setLayoutParams(origButton.getLayoutParams()); setGravity(origButton.getGravity()); setPadding(origButton.getPaddingLeft(), origButton.getPaddingTop(), origButton.getPaddingRight(), origButton.getPaddingBottom()); setTextSize(TypedValue.COMPLEX_UNIT_PX, origButton.getTextSize()); setTextColor(origButton.getTextColors()); // ... also copy whatever other attributes you care about } 

在你的布局文件中,只定义你的第一个button。 假设例如你想把你的button放在一个表中:

 <TableLayout android:id="@+id/button_table" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow android:id="@+id/button_row_0"> <com.mydomain.mypackage.NiceButton style="@style/niceButton" android:id="@+id/button_0" /> <!-- More rows/buttons created programmatically --> </TableRow> </TableLayout> 

请注意,使用了widget类的全限定名称; 显然,你将不得不用实际的包名replacecom.mydomain.mypackage

在你的活动中,你可能想要定义一个数组来保存对所有button的引用,并且当按下任何button时将调用一个公共监听器:

 NiceButton[] mButtonViews = new NiceButton[10]; private View.OnClickListener mNiceButtonClickListener = new View.OnClickListener() { public void onClick(View view) { int i = view.getId(); mButtonViews[i].setText("PRESSED!"); } }; 

注意如何将视图ID用作button数组中的索引。 所以你需要你的button有一个从0到n-1的id。

最后,这里是你可以在onCreate方法中创buildbutton的方式:

  // Retrieve some elements from the layout TableLayout table = (TableLayout)findViewById(R.id.button_table); TableRow row = (TableRow)findViewById(R.id.button_row_0); NiceButton origButton = (NiceButton)findViewById(R.id.button_0); // Prepare button 0 origButton.setId(0); origButton.setText("Button 0"); origButton.setOnClickListener(mNiceButtonClickListener); mButtonViews[0] = origButton; // Create buttons 1 to 10 for (int i = 1; i < 10; i++) { if (i % 2 == 0) { row = new TableRow(this); table.addView(row); } NiceButton button = new NiceButton(i, origButton); button.setText("Button " + i); button.setOnClickListener(mNiceButtonClickListener); mButtonViews[i] = button; row.addView(button); } 

按下一些button后,屏幕显示如下: 在这里输入图像说明

那么,有一些代码涉及到,但最终你可以创build尽可能多的小部件,你想要编程,仍然有他们的属性定义为一种风格。

如果你想对一个视图进行样式化,你有两个select:最简单的就是在代码中指定所有的元素:

 button.setTextColor(Color.RED); button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

另一种select是用XML定义样式,并将其应用于视图。 在一般情况下,你可以使用ContextThemeWrapperContextThemeWrapper这一点:

 ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); button = new Button(newContext); 

要更改TextView(或其子类,如Button)上与文本相关的属性,有一个特殊的方法:

button.setTextAppearance(context,R.style.MyTextStyle);

最后一个不能用来改变所有的属性; 例如要更改填充,您需要使用ContextThemeWrapper 。 但是对于文本的颜色,大小等,你可以使用setTextAppearance