【问题标题】:Permanently adding an item to an existing alertdialog?将项目永久添加到现有警报对话框?
【发布时间】:2012-09-21 14:25:05
【问题描述】:

我的目标是将项目永久添加到现有的 AlertDialog。

AlertDialog 的 XML 数组是:

<array name="serverchoice">
    <item>@string/chicago_server</item>
    <item>@string/london_server</item>
    <item>@string/sanjose_server</item>
    <item>@string/washington_server</item>
    <item>@string/chicagoq_server</item>
    <item>@string/londonq_server</item>
    <item>@string/sanjoseq_server</item>
    <item>@string/washingtonq_server</item>
</array>

如您所见,这是一个服务器列表,我希望用户能够添加自己的服务器,而不必使用预设的服务器。

我创建了一个带有文本框和按钮的页面,以便用户可以进入服务器。当用户单击“添加服务器”按钮时,我希望将条目添加到列表中。

目前,当用户从 AlertDialog 中选择一个菜单项时,它的处理方式如下:

    // Choose Server method

    private void openServerDialog() {
        new AlertDialog.Builder(this)     
        .setTitle(R.string.server_title)  
        .setItems(R.array.serverchoice,   
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialoginterface,
                    int i) {
                setServer(i);   
            }
        })
        .show();
    }

private void setServer(int i) {   


        if (String.valueOf(i).equals("0")){
            CustomServer.setText("mcsord.visualware.com");
        }
        else if (String.valueOf(i).equals("1")){
            CustomServer.setText("mcslhr.visualware.com");
            }
        else if (String.valueOf(i).equals("2")){
            CustomServer.setText("mcssjc.visualware.com");
            }
        else if (String.valueOf(i).equals("3")){
            CustomServer.setText("mcsiad.visualware.com");
            }
        else if (String.valueOf(i).equals("4")){
            CustomServer.setText("qualitytestord.visualware.com");
            }
        else if (String.valueOf(i).equals("5")){
            CustomServer.setText("qualitytestlhr.visualware.com");
            }
        else if (String.valueOf(i).equals("6")){
            CustomServer.setText("qualitytestsjc.visualware.com");
            }
        else if (String.valueOf(i).equals("7")){
            CustomServer.setText("qualitytestiad.visualware.com");
            }

}

我现在要做的就是在用户选择添加一个永久项目时再获得一个。我关于这个的最后一个问题还不够清楚。我不想要选项菜单或上下文菜单。

谢谢

编辑:

环顾四周,我发现人们说不可能动态添加到数组列表中。

目前我有一个选项菜单,当在 android 手机本身上按下菜单按钮时会显示自己。我使用的代码是:

public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.settings_menu, menu);
        return true;
    }



    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
    switch (item.getItemId()) {
            case R.id.add_server:
                    addNewServer();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

是否可以创建另一个选项菜单并使用它来代替上面显示的 AlertDialog?或者我会遇到无法动态添加列表项的问题。

我确实可以让用户输入他们自己的 URL,但它不会保存它,他们必须每次都继续输入。

谢谢

【问题讨论】:

  • 据我所知,您无法在运行时编辑这些 xml 文件。您将需要使用其他一些持久性存储服务(sqlite 或 web 服务)来保存添加的条目。那么当需要向他们展示时,您需要检查替代位置并将其添加到列表中

标签: android xml add android-alertdialog


【解决方案1】:

我不确定我是否理解您的问题……但我会尽力回答。 首先,您可以在为 alertDialog 充气后添加动态的新选项。你不能做的是在你膨胀它们的地方向 xml 添加新行。

话虽如此,您需要在活动完成后将新服务器存储在某个地方,以便稍后恢复它们。为此,您有多种选择,我将从我认为最简单的一种开始:

将服务器存储在共享首选项文件中:

保存示例

    Editor editor = getSharedPreferences("FileName", MODE_PRIVATE).edit();
    editor.clear();
    editor.putString("server1", "serverName1");
    editor.putString("server2", "serverName2");
    editor.commit();

阅读示例:

    SharedPreferences preferences = getSharedPreferences("FileName", MODE_PRIVATE);
    preferences.getString("server1", "defaultValue");
    preferences.getString("server2", "defaultValue");

您还可以使用数据库来存储值。如果您希望有一个包含数百台服务器的列表,这会更好,因为在这种情况下,以前的解决方案的性能会很差。

最后,您可以将信息存储在一个文件中,但这需要更多代码,而且我看不出它有什么真正的好处。

如果我没有回答你的问题,请告诉我。祝你好运。

【讨论】:

  • 谢谢@Luis,我想这就是我所追求的。我只希望将几台服务器添加到列表中。我们将该应用程序作为使用我们的 API 可以完成的操作的示例,因此它不必很广泛。
  • 所以从首选项文件开始将包含我最初的问题中列出的预设服务器?然后我可以添加到共享首选项文件中,以便下次调用它时包含最近添加的条目吗?
  • 是的。您应该在第一次应用程序运行时(或者只是测试共享首选项中尚未定义服务器)添加您的默认服务器列表。稍后,您可以将用户键入的任何其他服务器添加到列表中,只需使用上面的相同代码即可。请记住,如果您没有重写所有服务器,而只是添加一个新服务器,则可能需要删除代码行“editor.clear()”,因为该行删除了共享首选项文件中的所有信息在附加新值之前。问候
【解决方案2】:

您可以在 xml 文件中保留默认值,但您需要将自定义服务器存储在数据库中。然后,您可以从两个源中提取一个数组并将其放入对话框中。

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

【讨论】:

  • 我相信 CaseyB 建议“项目”的示例将驻留在某个数据库中,因此您可能需要将默认值(在您的 xml 中)与数​​据库元素连接起来,然后您可以此时将它们添加到列表中。这是一个正确的假设 CaseyB 吗?
猜你喜欢
  • 2012-04-03
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2019-12-11
  • 2016-03-05
相关资源
最近更新 更多