【问题标题】:Wait for Input in Alert Dialog Spinner在警报对话框微调器中等待输入
【发布时间】:2017-02-10 01:38:02
【问题描述】:

我看到this question 关于在 AlertDialog 中放置一个微调器,但从我可以看到对话框显示,脚本继续。一旦做出选择,它也会迅速关闭。如果您有一个 onDismiss 或 onClick 侦听器根据您选择的内容触发单独的函数/活动,这将是一件好事,但这不是我需要的。

目前,我的应用正在轮询 TimerTask 内的 URL,并检索数据。在这个TimerTask 中,数据被解析并最终保存。根据数据,可能需要向用户询问更多详细信息。

我的目标是等到用户从微调器对话框中进行选择,单击“确定”按钮,然后继续解析数据并将其发送到另一个类以存储在数据库中。我该怎么做?

Timer timer = new Timer();
TimerTask checkApi = new TimerTask(){
    @Override
    public void run(){
        try {
            JSONObject changes = new JSONObject(/* External class that gets data from URL */);
            if (changes.getBoolean("success")){

                /* This is where the data is parsed */

                /* Example skeleton code: */

                 JSONObject parsed_data = changes.getJSONObject("some_data");

                 if (changes.has("possibly missing detail")){
                     // This is where I want to wait for the selection to be made
                     String detail = dialogSpinnerResponse();
                 } else {
                     String detail = changes.getString("possibly missing detail");
                 }

                 parsed_data.put("important_detail", detail);

                 JSONObject reponse = new JSONObject(/* Result from sending parsed_data to external class for saving */);

                 // error handling if needed ...

            } else {
                e.printStackTrace();
            }
        } catch (JSONException e){
            e.printStackTrace();
        }
    }
};

此计时器任务在任何函数之外初始化,作为我的 Main 类顶部的变量,并在我的活动的 onCreate() 方法中启动。

我已经对此进行了测试,它会正确轮询 url 并显示未过滤的数据。现在我正在实现它的解析部分,在将其发送到保存它的外部类之前,我需要等待用户输入。

【问题讨论】:

  • 你应该显示一些代码。这样你就不必请求宽恕了。
  • 你实现了spinner onItemSelected监听器吗?
  • 我了解如何使用“onItemSelected”侦听器,但我不知道如何阻止我的脚本继续工作,直到做出这样的选择。此外,此微调器并不总是显示,这意味着此类侦听器中包含的所有内容都是某种“继续”命令,该命令设置所需的变量并继续工作。
  • 我会添加一些东西给你看

标签: java android


【解决方案1】:

我决定使用我的常识并简单地创建第二个函数,该函数仅在知道细节时才运行。这是我的代码,以防有人想做这样的事情。它会阻止用户关闭对话框,并从onClick 侦听器运行解析函数,如果知道详细信息,则立即运行。

TimerTask checkApi = new TimerTask(){
    @Override
    public void run(){
        try {
            JSONObject changes = new JSONObject(/* External class that gets data from URL */);
            if (changes.getBoolean("success")){

                /* This is where the data is parsed */

                /* Example skeleton code: */

                 JSONObject parsed_data = changes.getJSONObject("some_data");

                 if (changes.has("possibly missing detail")){
                     parseData(changes, changes.getString("possibly missing detail"));
                 } else {
                     // todo: Ask user for detail
                     AlertDialog.Builder dialog_builder = new AlertDialog.Builder(MainActivity.this);
                     View mView = getLayoutInflater().inflate(R.layout.dialog_spinner, null);
                     dialog_builder.setMessage(R.string.need_detail_message);
                     dialog_builder.setTitle(R.string.need_detail_title);
                     final Spinner spinner = (Spinner) mView.findViewById(R.id.spinner);
                     List<String> detail_list = /* details from external class */;
                     detail_list.add(0, getString(R.string.need_detail_select));
                     ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, detail_list);
                     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                     spinner.setAdapter(adapter);

                     dialog_builder.setPositiveButton(R.string.CONTINUE_GENERAL, new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int which) {
                             // Do nothing yet
                         }
                     });

                     dialog_builder.setView(mView);

                     final AlertDialog dialog = dialog_builder.create();
                     dialog.setCancelable(false);
                     dialog.setCanceledOnTouchOutside(false);
                     dialog.show();
                     dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
                             String selection = spinner.getSelectedItem().toString();
                             if (!selection.equals(getString(R.string.need_detail_select))){
                                 // todo: send to function
                                 parseData(changes, selection);
                                 dialog.dismiss();
                             } else {
                                 Toast.makeText(Tracking.this, R.string.need_detail_toast, Toast.LENGTH_SHORT).show();
                             }
                         }
                     });
                 }
             } else {
                 e.printStackTrace();
             }
         } catch (JSONException e){
             e.printStackTrace();
         }
     }
 };

 private void parseData(JSONObject changes, String detail){
     /* Do werk */
 }

哇

双U,哦,双U。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多