【问题标题】:Android TextView is not showing data on setText even if data is present即使存在数据,Android TextView 也不会在 setText 上显示数据
【发布时间】:2017-04-16 10:05:38
【问题描述】:

我正在做一个小项目,用户在尝试登录后会看到他的结果,并且他已经在我的应用上进行了测验。

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

    }
}

【问题讨论】:

  • 哪一行代码应该在 textView 中显示你的分数?
  • mScoreTextView.setText(mScore);
  • 为什么要在 onCreate 中设置文本?
  • 我还能做什么?
  • 在说之前请先学习一些Java。您的 mScore 首先分配给 textview,然后在 AsyncTask 中初始化。不幸的是,Android 不支持基于字符串变量的文本视图自动更新,每当您更新变量时,您必须再次设置为 textview

标签: java android xml android-studio


【解决方案1】:

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

        }
    }

【讨论】:

  • 请在ui thread runnable中添加设置文本部分。其他一切都很完美
  • 好吧,让我试试这个:)
【解决方案2】:

将您的 mScore 字符串放入 log 以查看您是否在 logcat 中获取数据。也尝试改变你的文本视图的颜色。还将您的 textview.settext() 放入 onpostexecute();方法

【讨论】:

  • 好的,让我检查一下:)
  • 好吧,也把你的 textview.settext(mScore);在 onPostExecute 方法中。因为当第一次调用 onCreate 时,您的 textview 始终为空。
  • 我的问题由此解决:mScore 设置在异步任务中。所以你必须在 onPostExecute 中设置文本。
  • 是的,这似乎是问题
【解决方案3】:

onPostExecute()设置文本:

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

【讨论】:

  • 非常感谢 Ferdous Ahamed 的回答 :)
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多