【发布时间】:2015-07-15 16:32:46
【问题描述】:
我创建了两个相当长的函数,它们创建了一个 AlertDialogBuilder,它构建了一个填充并启动的 AlertDialog。生成的警报对话框对于对话框来说相当大,因此需要在对话框中填充大量视图。为了整洁、可测试性、SRP 等,我决定将这些函数移到一个新类中。
原来这些函数是直接放在Activity类中的,并且警报对话框启动得很好。我现在将两者都移到了 AlertDialogLauncher 类,该类在启动时采用 Activity 参数,大部分原始代码是相同的,我已经让警报对话框工作了,但是我的一些文本的颜色和背景颜色视图已关闭。
所以对话框启动正常,只是颜色不正确,所以我想它正在加载不正确的样式或类似的东西?
代码...
原始版本(缩短)
private void addNormalRow(final ScannedWiFiNetwork network) {
TableRow row = (TableRow) View.inflate(this, R.layout.regular_network_table_row, null);
// loads of code
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchNewNetworkDialog(network);
}
});
}
private void launchPreferredNetworkDialog(final ScannedWiFiNetwork network) {
final AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("Connect to "+network.getSsid()+"?")
.setView(getLayoutInflater().inflate(R.layout.preferred_network_dialog,null))
.setCancelable(false)
.show();
final EditText passwordInput = (EditText) dialog.findViewById(R.id.edit_text_password);
TextView passwordText = (TextView) dialog.findViewById(R.id.dialog_password);
//loads of code
}
本质上,调用启动对话框函数并通过向 AlertDialog.Builder 传递对此(我的活动的 Java 类)的引用来创建新的 AlertDialog。
重构的活动/接口类
private void addNormalRow(final ScannedWiFiNetwork network) {
TableRow row = (TableRow) View.inflate(this, R.layout.regular_network_table_row, null);
//loads of code
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Activity activity = (Activity) v.getContext();
dialogs.launchNewNetworkDialog(network, activity);
}
});
}
新的 AlertDialogLauncher 类
public void launchPreferredNetworkDialog(final ScannedWiFiNetwork network, final Activity activity) {
Context con = activity.getApplicationContext();
LayoutInflater layoutInflater = LayoutInflater.from(con);
final AlertDialog dialog = new AlertDialog.Builder(activity)
.setTitle("Connect to "+network.getSsid()+"?")
.setView((layoutInflater.inflate(R.layout.preferred_network_dialog,null)))
.setCancelable(false)
.show();
如您所见,在这个新类中,必须传入一个 Activity 以用于创建布局膨胀器和稍后用于填充视图的上下文对象。所有这些都可以正常工作,但是如前所述,文本颜色和按钮背景会发生变化。
我正在加载相同的 xml 布局文件,因此当我为其提供默认活动对象时,我假设它以某种方式加载了不正确或默认样式(通过在添加到对话框的按钮视图上调用 getContext 检索) .
我尝试用 NetworkListActivity.this(我的活动名称)替换“活动”,这样可以编译但给我同样的毁坏样式结果。
提前感谢您的帮助。希望问题很清楚!
【问题讨论】:
-
您是否尝试过根据对话框构建器的主题扩展您的内容视图?所以使用
dialog.setView(LayoutInflater.from(dialog.getContext()).inflate(R.layout.preferred_network_dialog, null))。或者,如果您的目标是 API 21+,只需使用dialog.setView(R.layout.preferred_network_dialog)。 -
似乎不能这样做。 setView 行与 Builder 构造函数内联,该行包含对对话框的引用,但由于该对象尚未构建,我无法使用它。我试图单独调用它,但之后我不能调用它,因为我在构造函数的末尾调用了 show(),我不能调用 setView 然后稍后再显示,似乎不起作用.
-
对不起,应该是 dialogBuilder.setView() 和 dialogBuilder.getContext()。为构建器创建一个单独的变量,分解构建器调用链,并在单独的行上调用 show()。
标签: java android dialog android-alertdialog