Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does Android TextView.SetText(int resid) work?

This an example from Big Nerd Ranch Guide:

package com.example.geoquiz;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class QuizActivity extends ActionBarActivity {
    private Button mTrueButton;
    private Button mFalseButton;
    private Button mNextButton;
    private TextView mQuestionTextView;
    private TrueFalse[] mQuestionBank = new TrueFalse[] {
            new TrueFalse(R.string.question_africa, true),
            new TrueFalse(R.string.question_americas, false),
            new TrueFalse(R.string.question_asia, false),
            new TrueFalse(R.string.question_mideast, true),
            new TrueFalse(R.string.question_oceans, true)
    };
    private int mCurrentIndex = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        mTrueButton = (Button)findViewById(R.id.true_button);
        mFalseButton = (Button)findViewById(R.id.false_button);
        mTrueButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(QuizActivity.this, R.string.incorrect_toast, Toast.LENGTH_SHORT).show();
            }
        });
        mFalseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(QuizActivity.this, R.string.correct_toast, Toast.LENGTH_SHORT).show();
            }
        });

        mQuestionTextView = (TextView)findViewById(R.id.question_text_view);
        int question = mQuestionBank[mCurrentIndex].getQuestion();
        mQuestionTextView.setText(question);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.quiz, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

The part in question is this:

    int question = mQuestionBank[mCurrentIndex].getQuestion();
    mQuestionTextView.setText(question);

question is an int here, I wonder how this works. More strangely, if I change question into a literal int, e.g. 1, then the app won't work.

like image 883
qed Avatar asked Jan 10 '23 13:01

qed


2 Answers

The Docs I thought described this better so I'm not sure if they changed them recently (or since I last looked).

Anyway, when you supply an int as the param it refers to a resource id. So, if you have a string resource in your strings.xml you can supply it here instead of a literal String.

So, if in your strings.xml you have

<resources>
    <string name="hello">Hello!</string>
</resources>

you could do

myTV.setText(R.string.hello);

and myTV would show "Hello".

When you pass it an int that doesn't match an id in R.strings then you get the exception.

like image 111
codeMagic Avatar answered Jan 12 '23 02:01

codeMagic


The Strings you pre-define in the xml have dynamically generated ids in the R.java class. For example R.string.question_africa is an integer, pointing to your saved String resource. You can open the R.java class and see the exact integers that refer to your strings but it won't mean anything to you since they're automatically generated.

setText() method can be called on different variables, in your example is setText(int resId), where resId is a resource id

More: http://developer.android.com/reference/android/widget/TextView.html#setText(int)

like image 36
Ivan Skoric Avatar answered Jan 12 '23 03:01

Ivan Skoric