添加到 Layout 的视图继承父级的样式

View added to Layout inherits parent's style

我正在重用 extends DialogFragment 的自定义 InputDialog 并在 EditInputDialog 上添加一个 Delete 按钮所有这些工作正常,但是现在我正在研究样式,发现了这个古怪的小问题:

我希望 删除 按钮使用按钮的默认设备样式

这里是布局的简单样式(/res/values/styles.xml):

<style name="myBackgroundStyle" parent="@android:style/Theme.Dialog">
    <item name="android:background">#FF0000</item>
</style>

以下是我创建和添加按钮的方式:

Button btnDelete = new Button(getActivity());
btnDelete.setText("Delete");
RelativeLayout rl = (RelativeLayout)view.findViewById(R.id.inputLayout);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.RIGHT_OF, R.id.btnSave);
lp.addRule(RelativeLayout.ALIGN_BASELINE, R.id.btnSave);
btnDelete.setLayoutParams(lp);
rl.addView(btnDelete);

我也试过在创建按钮时应用样式,例如:

new Button(getActivity(),null,android.R.attr.buttonStyle); 

.buttonStyle 不是我唯一尝试过的

但这根本没有帮助。有没有我遗漏的东西,或者这是怎么回事?

这种风格不是我最终要采用的风格,这只是为了测试,然后我 运行 进入了这个问题。

您需要向按钮提供对话框的上下文而不是 activity 上下文,以便它可以检索正确的主题(Dialog 基础 class 使用 ContextThemeWrapper 包装 activity 上下文,同时提供它自己的主题)。

将传递给按钮构造函数的 getActivity() 替换为 getDialog().getContext() 应该可以解决问题。请注意,传递给 onCreateView() 回调的 LayoutInflater 是使用正确的上下文初始化的,您也可以通过调用 inflater.getContext().

从那里检索它