2016-03-27 13 views
0

Toastを画面に表示しようとしていて、Toastが消えると次の質問に移動します。私はThreadで試しましたが、管理できないようです。スレッドが終了して次の位置に移動するのを待ちます

マイコード:

next.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (getUserSelection()){ 
        position = position + 3; 
        if (position < questionsArray.size()) { 
         curName = questionsArray.get(position).getName(); 
         curArray = questionsArray.get(position).getAnswers(); 
         curIscorrect = questionsArray.get(position).getIscorrect(); 
         setupQuestionView(curName, curArray, curIscorrect); 
        } else { 
         StringGenerator.showToast(QuestionsActivity.this, "Your score : " + score + "/" + (questionsArray.size()/3)); 
        } 
       }else { 
        StringGenerator.showToast(QuestionsActivity.this, getString(R.string.noanswerselected)); 
       } 
      } 
     }); 

とgetUserSelectionMethod:

private boolean getUserSelection() { 
     correct = (RadioButton)findViewById(group.getCheckedRadioButtonId()); 
     if (correct == null){ 
      return false; 
     }else { 
      correctAnswerText = correct.getText().toString(); 
      if (map.get(correctAnswerText).equals(Constants.CORRECTANSWER)) { 
       score++; 
       setCorrectMessage(); 
       return true; 
      } else { 
       setWrongMessage(); 
       return true; 
      } 
     } 
    } 

    private void setCorrectMessage() { 
     correctToast = new Toast(QuestionsActivity.this); 
     correctToastView = getLayoutInflater().inflate(R.layout.correct, (ViewGroup) findViewById(R.id.correctRootLayout)); 
     correctText = (TextView)correctToastView.findViewById(R.id.correctTextView); 
     correctText.setText(getString(R.string.correctAnswer)); 
     correctToast.setDuration(Toast.LENGTH_SHORT); 
     correctToast.setView(correctToastView); 
     correctToast.show(); 
     correctThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       correctToast.cancel(); 
      } 
     }); 
     correctThread.start(); 
    } 

    private void setWrongMessage() { 
     wrongToast = new Toast(QuestionsActivity.this); 
     wrongToastView = getLayoutInflater().inflate(R.layout.wrong, (ViewGroup) findViewById(R.id.wrongRootLayout)); 
     wrongText = (TextView)wrongToastView.findViewById(R.id.wrongTextView); 
     wrongText.setText(getString(R.string.wrongAnswer)); 
     wrongToast.setDuration(Toast.LENGTH_SHORT); 
     wrongToast.setView(wrongToastView); 
     wrongToast.show(); 
     wrongThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       wrongToast.cancel(); 
      } 
     }); 
     wrongThread.start(); 
    } 

これを行う方法上の任意の提案?あなたのトーストはもう表示されていないよりも、結果は、nullの場合

toast.getView().getWindowToken() 

、そしてあなたが望む任意のコードを実行することができるより:

+0

ビュー階層を作成した元のスレッドだけがそのビューに触れることができます –

答えて

2

あなたはトーストの可視性を決定することができます。

2

this answerに述べたように、あなたはトーストの期間を待つスレッドを開始することができます:あなたはのいずれかのハードコードの期間を持っているか、定数でそれらを保つよう

Thread thread = new Thread(){ 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(3500); // 3.5seconds! 
      // Do the stuff you want to be done after the Toast disappeared 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

Toast.LENGTH_SHORTToast.LENGTH_LONGはフラグだけです。期間は3.5秒(長)と2秒(短)です。


ビューのいくつかを操作したい場合は、「メイン」UIスレッド以外のスレッドでこれを行うことはできません。したがって、SleepThreadが終了したときに通知を受けるために、ある種のコールバック/ポーリングメカニズムを実装する必要があります。 this answerに、これを行う方法のいくつかをお読みください。彼らが理解して実装するのが最も簡単なのはおそらく次のとおりです。

スレッドを開始した後、まだ生きているかどうかと、実行中であることを確認するには、thread.isAlive()を呼び出します。あなたは、スレッドの実行中に実行されるwhileループを行うことができます。このように:

// start your thread 
while(thread.isAlive()){} 
// continue the work. The other thread has finished. 

これは、これを行うための最もエレガントな方法はありませんのでご注意ください!上記の答えの他の可能性をチェックしてください。より洗練されたソリューション(特にリスナーの最後のものは非常に興味深く、読んでおいてください!)です。

+0

ビュー階層に作成された元のスレッドのみがそのビューに触れることができます –

+0

'睡眠?任意のビューを操作しますか? – user187470

+0

はい私は別の質問の文章を設定しています –

0

別のスレッドでUI要素にアクセスしようとしたこのようにコードを変更する:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
      try { 
       Thread.sleep(500); 
       QuestionsActivity.this.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         moveToNextQuestion(); 
        } 
       }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
    } 
}); 
thread.start(); 

したことがあります。私の答えが誰かを助けることを願っています

0

これは、Threadクラスが純粋にバックグラウンドで実行され、メインスレッドのビューを操作する必要があるからです。問題を解決するには、ThreadAsynTaskに置き換えてください。

AsyncTask<Void,Void,Void> a = new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       super.onPostExecute(aVoid); 
       correctToast.cancel(); 
      } 
     }; 
     a.execute(); 

あなたは私のコードを見れば、あなたが私のonPostExecuteを見ることができ、この方法は、メインスレッドで呼び出されます。

+0

@downvoters私の答えをdownvotingのあなたの側を説明してください。将来の訪問者に必要な事実を提供することができます。それ以外の場合は、問題について誤った仮定をする可能性があります。 – Enzokie

関連する問題