gpt4 book ai didi

android - 以编程方式创建具有特定样式的 Android View

转载 作者:可可西里 更新时间:2023-11-01 18:43:57 26 4
gpt4 key购买 nike

其他questions比如说不能以编程方式设置样式,但是 View 可以使用样式初始化,例如从 XML 加载时。

如何以编程方式(不是在 XML 中)初始化具有特定样式的 View?我尝试使用 View(Context context, AttributeSet attrs, int defStyle) ,但我不知道要为第二个参数解析什么。传入 null 会导致 View 不显示

最佳答案

我遇到了同样的问题,但到目前为止还没有找到直接以编程方式设置样式的实用方法。我想用很多给定类型的小部件填充我的屏幕,比方说按钮。在布局文件中定义它们是不切实际的。我想以编程方式创建它们,但我也想在样式 xml 文件中定义它们的样式。

我设计的解决方案包括在布局文件中只定义其中一个小部件,以编程方式创建所有其他小部件,并将样式信息从第一个小部件克隆到其他小部件。

下面是一个例子。

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

<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”。定义充气器所需的构造函数:

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

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

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
}

在布局文件中,只定义第一个按钮。例如,假设您想将按钮放在表格中:

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

注意使用了小部件类的全限定名;显然,您必须将 com.mydomain.mypackage 替换为实际的包名称。

在您的 Activity 中,您可能想要定义一个数组,该数组将保存对所有按钮的引用,以及一个在按下任何按钮时调用的公共(public)监听器:

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

请注意 View ID 如何用作按钮数组中的索引。所以你需要你的按钮有一个从 0 到 n-1 的 id。

最后,您可以通过以下方式在 onCreate 方法中创建按钮:

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

以下是您按下一些按钮后屏幕的显示方式: enter image description here

虽然涉及一些代码,但最终您可以通过编程方式创建任意数量的小部件,并且仍然将它们的属性定义为样式。

关于android - 以编程方式创建具有特定样式的 Android View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com