2017-02-10 13 views
0

AlertDialogにスピナーを置くことについては、this questionが見えましたが、ダイアログの表示が見えるものから、スクリプトは続けられます。また、選択が行われるとすぐにすぐに終了します。あなたが選択した内容に応じて別の機能/アクティビティを起動するリスナ(onDismissまたはonClick)を持っていれば、これは良いことですが、これは私が必要なものではありません。Alert Dialog Spinnerで入力を待つ

現在、私のアプリはTimerTaskのURLをポーリングし、データを取得しています。このTimerTaskの中で、データは解析され、最終的に保存されます。データに応じて、ユーザーに詳細を尋ねる必要があります。

私の目標は、ユーザーがスピナーダイアログから選択を行い、「OK」ボタンをクリックしてデータの解析を再開し、別のクラスに送信してデータベース内に格納するまで待つことです。これどうやってするの?

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(); 
     } 
    } 
}; 

このタイマータスクは、私のメインクラスの最上部にある変数として、任意の関数の外で初期化され、私の活動のonCreate()方法で開始されました。

これをテストして、URLを正しくポーリングし、フィルタリングされていないデータを表示します。今私はそれを保存する外部クラスに送信する前にユーザーの入力を待つ必要がある、それの解析部分を実装しています。

+0

コードを表示する必要があります。それで、あなたは許しを求める必要はありません。 –

+0

spinner onItemSelectedリスナーを実装しましたか? – Deepesh

+0

"onItemSelected"リスナーの使い方を理解していますが、そのような選択が行われるまでスクリプトの作業を続行できないようにする方法はわかりません。また、このスピンナーは常に表示されるとは限りません。つまり、そのようなリスナーに含まれるすべてのものは、必要な変数を設定して作業を続ける何らかの「続行」コマンドです。 –

答えて

0

私は常識を使い、詳細が分かっているときにだけ実行される第2の関数を作成することにしました。ここで私のコードは誰もこれのような何かをしたいと思っているincaseです。ユーザーがダイアログを閉じないようにし、リスナーの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。

関連する問題