当前位置: 首页 > 知识库问答 >
问题:

将Android AlertDialogBuilder代码重构为另一个类,对话框中断的样式

贝自怡
2023-03-14

我创建了两个相当长的函数,它们创建了一个AlertDialogBuilder,AlertDialogBuilder创建了一个已填充并启动的AlertDialog。生成的警报对话框对于对话框来说相当大,因此需要在对话框中填充大量视图。出于清洁性、可测试性、SRP等方面的考虑,我决定将这些函数移到一个新的类中。

原来函数直接放在Activity类中,警报对话框启动得很好。现在,我将两者都移到了一个AlertDialogLauncher类,它在启动时接受一个Activity参数,原来的大部分代码是相同的,我已经使alert对话框工作,但是我的一些视图的文本颜色和背景颜色是关闭的。

所以对话框启动得很好,只是颜色不正确,所以我想它是加载了一个不正确的样式或类似的东西?

代码...

原始版本(缩短)

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
}

本质上,调用launch dialog函数并通过向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);
        }
    });
}
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();

事先谢谢你的帮助。希望问题清楚!

共有1个答案

朱兴运
2023-03-14

解决了我的问题..我从未将样式应用到对话框xml布局文件中,一些我没有指定显式文本颜色的文本视图默认为对话框的样式,我在尝试更改样式时发现了这一点,这可以通过将r.style.style_name添加到AlertDialogBuilder构造函数(在'activity'参数之后)来实现。

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

 类似资料:
  • 我使用MFC和对话框创建了两个独立的可执行文件项目。 我是visual studio的新手,所以请给出一些建议。谢谢

  • 我有一个Groovy/Spock单元测试,如下所示: 这个测试将不会出现问题。但是,我有其他测试需要,所以我想将代码移到一个公共类中: 请注意,我不想在这里使用继承,而是将常见的模仿代码移到帮助器类中。但当我这么做的时候,我的斯波克测试失败了。 有什么适当的方法来重构Spock嘲笑代码吗?

  • 本文向大家介绍Android中创建对话框(确定取消对话框、单选对话框、多选对话框)实例代码,包括了Android中创建对话框(确定取消对话框、单选对话框、多选对话框)实例代码的使用技巧和注意事项,需要的朋友参考一下 Android中可以创建三种对话框、确定取消对话框、单选对话框、多选对话框 android中的确定取消对话框演示示例 Android中使用单选对话框的演示案例 android中使用多选

  • 问题内容: 我正在寻找一种样式对话框(使用UI对话框),该样式对话框具有与传统对话框不同的独特CSS,因此从本质上讲,它具有两个外观各异的jQuery对话框。 例如,我已经设置了样式 还有一个 不幸的是,我注意到使用单独的CSS来设置对话框各部分的样式,例如 不起作用,因为没有该类,并且我也不能不插入插件而这样做。 另一种选择是使一个元素具有唯一的类/ id(取决于我想要的类/ id),但是这将阻

  • 你好朋友们.... 我目前正在尝试使用隐式意图创建一个对话框,其中我希望显示我的对话框,如whatsApp(个人资料照片屏幕),在该屏幕中,WhatsPP使用了名为“删除照片”的额外字段。当我尝试创建相同类型的屏幕对话框时,我无法添加此额外字段(“删除照片”)。我已经完成了所有代码。对于对话框中的三个选项(Gallery、Photo、Camera),它工作正常,但我无法在onActivityRes

  • 我是java新手,我正试图编写我的第一个“更大”的程序,包含几个类。我在类“CompetitionProgram”中创建了一个ArrayList并将其声明为private。 我的程序中需要这两个类(Event&ListOfEvents),这是需求之一。事件--它只是表示事件本身,比如事件名称和尝试次数(它是一个体育事件)。和ListOfEvents--它表示列表本身,并包含用于添加事件、删除事件和