【问题标题】:Refactored Android AlertDialogBuilder code to another class, style of the dialog breaks将 Android AlertDialogBu​​ilder 代码重构为另一个类,对话框样式中断
【发布时间】:2015-07-15 16:32:46
【问题描述】:

我创建了两个相当长的函数,它们创建了一个 AlertDialogBu​​ilder,它构建了一个填充并启动的 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 然后稍后再显示,似乎不起作用.
  • 对不起,应该是 dialogBu​​ilder.setView() 和 dialogBu​​ilder.getContext()。为构建器创建一个单独的变量,分解构建器调用链,并在单独的行上调用 show()。

标签: java android dialog android-alertdialog


【解决方案1】:

想通了我的问题..我从未将样式应用于我的对话框 xml 布局文件,一些我没有指定显式文本颜色的文本视图默认为对话框的样式,我在试验时发现了这一点更改样式可以通过将 R.style.STYLE_NAME 添加到 AlertDialogBu​​ilder 构造函数(在“活动”参数之后)来完成。

是的,我只是没有应用样式,需要小心我没有应用样式的视图!

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2011-08-05
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多