2017-04-16 133 views
0

我正在開發一個小型項目,用戶在他嘗試登錄後顯示他的結果,並且他已經在我的應用程序中參加了測驗。即使數據存在,Android TextView也不會在setText上顯示數據

So i'm using a page like this to display result.

但我不能顯示我的分數。此頁面還有一個選項,可以分享您的分數,並且可以正常工作並顯示分數。 Share option containing result.

我附上我的XML和Java代碼,請幫助我解決這個問題,這將是很大的幫助。

感謝&問候

BugAdder

XML代碼:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:gravity="center|top"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="30dp" 
     android:padding="20dp" 
     android:textAlignment="center" 
     android:textSize="25sp" 
     android:textStyle="bold" 
     android:text="@string/login_score_title"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="30dp" 
     android:padding="20dp" 
     android:textSize="25sp" 
     android:textStyle="bold" 
     android:text="@string/score_result"/> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30sp" 
     android:textStyle="bold" 
     android:id="@+id/login_score_text"/> 

    <Button 
     android:padding="20dp" 
     android:layout_marginTop="75dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/login_share_button" 
     android:text="@string/share_button"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="20dp" 
     android:text="@string/exit_button" 
     android:drawableEnd="@drawable/arrow_right" 
     android:drawableRight="@drawable/arrow_right" 
     android:id="@+id/login_exit_button"/> 


</LinearLayout> 

</ScrollView> 

Java代碼:

public class QuizLoginScore extends AppCompatActivity { 

    private List<ScoreItem> mScoreItems = new ArrayList<>(); 
    private ProgressDialog mProgressDialog; 
    private String mScore; 
    private TextView mScoreTextView; 
    private Button mShareButton; 
    private Button mExitButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.score_login_quiz); 
     mScoreTextView = (TextView)findViewById(R.id.login_score_text); 
     mShareButton = (Button)findViewById(R.id.login_share_button); 
     mExitButton = (Button)findViewById(R.id.login_exit_button); 
     new FetchScoresTask().execute(); 
     mScoreTextView.setText(mScore); 
     mExitButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(Build.VERSION.SDK_INT >= 21){ 
        finishAndRemoveTask(); 
       }else{ 
        finishAffinity(); 
        System.exit(0); 
       } 
      } 
     }); 

     mShareButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(Intent.ACTION_SEND); 
       i.setType("text/plain"); 
       i.putExtra(Intent.EXTRA_TEXT,getScoreShareReport(mScore)); 
       i.putExtra(Intent.EXTRA_SUBJECT,getString(R.string.score_report_subject)); 
       i = Intent.createChooser(i,getString(R.string.send_report)); 
       startActivity(i); 
      } 
     }); 

    } 

    public String getScoreShareReport(String score){ 
     String result; 
     StringBuilder sb = new StringBuilder(); 
     sb.append("QuizApp!"). 
       append("\n\n"). 
       append("I Just Scored"). 
       append(" \' "). 
       append(score). 
       append(" \' "). 
       append("marks out of \' 100 \' in Latest Quiz on QuizApp!\nWhats your Score Huh?"); 
     result = sb.toString(); 
     return result; 
    } 

    private class FetchScoresTask extends AsyncTask<Void, Void, List<ScoreItem>> { 
     @Override 
     protected void onPreExecute() { 

      mProgressDialog = new ProgressDialog(QuizLoginScore.this); 
      mProgressDialog.setTitle("Downloading Score"); 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      mProgressDialog.setMessage("Please wait while the score is being downloaded!"); 
      mProgressDialog.setCancelable(false); 
      mProgressDialog.show(); 
     } 

     @Override 
     protected List<ScoreItem> doInBackground(Void... params) { 
      return new ScoreFetcher().fetchScoreItems(); 
     } 

     @Override 
     protected void onPostExecute(List<ScoreItem> scoreItems) { 
      mScoreItems = scoreItems; 
      for(int i = 0; i < mScoreItems.size(); i++){ 
       if(mScoreItems.get(i).getUserId().equals(QuizLogin.mUserIdString)){ 
        mScore = String.valueOf(mScoreItems.get(i).getScore()); 
        break; 
       } 
      } 
      mProgressDialog.dismiss(); 
     } 

    } 
} 
+0

這行代碼應該dislpay你的分數在TextView的? – TDG

+0

mScoreTextView.setText(mScore); – BugAdder

+0

爲什麼在onCreate中設置文本? –

回答

2

mScore以異步任務設置。所以你必須在onPostExecute中設置文本。請嘗試以下代碼:

public class QuizLoginScore extends AppCompatActivity { 

     private List<ScoreItem> mScoreItems = new ArrayList<>(); 
     private ProgressDialog mProgressDialog; 
     private String mScore; 
     private TextView mScoreTextView; 
     private Button mShareButton; 
     private Button mExitButton; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.score_login_quiz); 
      mScoreTextView = (TextView)findViewById(R.id.login_score_text); 
      mShareButton = (Button)findViewById(R.id.login_share_button); 
      mExitButton = (Button)findViewById(R.id.login_exit_button); 
      new FetchScoresTask().execute(); 
      mScoreTextView.setText(mScore); 
      mExitButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(Build.VERSION.SDK_INT >= 21){ 
         finishAndRemoveTask(); 
        }else{ 
         finishAffinity(); 
         System.exit(0); 
        } 
       } 
      }); 

      mShareButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent i = new Intent(Intent.ACTION_SEND); 
        i.setType("text/plain"); 
        i.putExtra(Intent.EXTRA_TEXT,getScoreShareReport(mScore)); 
        i.putExtra(Intent.EXTRA_SUBJECT,getString(R.string.score_report_subject)); 
        i = Intent.createChooser(i,getString(R.string.send_report)); 
        startActivity(i); 
       } 
      }); 

     } 

     public String getScoreShareReport(String score){ 
      String result; 
      StringBuilder sb = new StringBuilder(); 
      sb.append("QuizApp!"). 
        append("\n\n"). 
        append("I Just Scored"). 
        append(" \' "). 
        append(score). 
        append(" \' "). 
        append("marks out of \' 100 \' in Latest Quiz on QuizApp!\nWhats your Score Huh?"); 
      result = sb.toString(); 
      return result; 
     } 

     private class FetchScoresTask extends AsyncTask<Void, Void, List<ScoreItem>> { 
      @Override 
      protected void onPreExecute() { 

       mProgressDialog = new ProgressDialog(QuizLoginScore.this); 
       mProgressDialog.setTitle("Downloading Score"); 
       mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
       mProgressDialog.setMessage("Please wait while the score is being downloaded!"); 
       mProgressDialog.setCancelable(false); 
       mProgressDialog.show(); 
      } 

      @Override 
      protected List<ScoreItem> doInBackground(Void... params) { 
       return new ScoreFetcher().fetchScoreItems(); 
      } 

      @Override 
      protected void onPostExecute(List<ScoreItem> scoreItems) { 
       mScoreItems = scoreItems; 
       for(int i = 0; i < mScoreItems.size(); i++){ 
        if(mScoreItems.get(i).getUserId().equals(QuizLogin.mUserIdString)){ 
         mScore = String.valueOf(mScoreItems.get(i).getScore()); 

      mScoreTextView.setText(mScore); 
         break; 
        } 
       } 
       mProgressDialog.dismiss(); 
      } 

     } 
    } 
+0

請在ui線程runnable中添加設置文本部分。一切都很完美 –

+0

好吧,讓我試試這個:) – BugAdder

+0

感謝哥們它解決了我的問題:) – BugAdder

0

將您的mScore字符串放入日誌以查看您是否正在以logcat方式獲取數據。也可以嘗試改變你的textview的顏色。同時把你的textview.settext()放在onpostexecute();從onPostExecute()方法

+0

好吧,讓我檢查:) – BugAdder

+0

好吧,也把你的textview.settext(mScore);在onPostExecute方法中。因爲當第一次調用onCreate時,你的textview總是爲空。 –

+0

我的問題解決了這個問題:mScore設置在一個異步任務。所以你必須在onPostExecute中設置文本。 – BugAdder

0

設置文本:

 @Override 
     protected void onPostExecute(List<ScoreItem> scoreItems) { 
      mScoreItems = scoreItems; 
      for(int i = 0; i < mScoreItems.size(); i++){ 
       if(mScoreItems.get(i).getUserId().equals(QuizLogin.mUserIdString)){ 
        mScore = String.valueOf(mScoreItems.get(i).getScore()); 
        mScoreTextView.setText(mScore); 

        break; 
       } 
      } 
      mProgressDialog.dismiss(); 
     } 
+0

謝謝你Ferdous艾哈邁德你回答:) – BugAdder

相關問題