Android TextView.setText принудительно закрывается

1

Я пытаюсь Google University Android lab1 вас попросят изменить текстовое содержимое TextView в соответствии со значением, переданным через Intent из другого деятельность.

Я пробовал остальную часть своего кода, но... почему моя приложение закрывается, когда я добавляю строку tv.settext(...)??

public class HelloWorld extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /*
         * Fetch and display passed string.
         */
        TextView tv = (TextView) findViewById(R.id.HelloTV);
        Bundle extras = this.getIntent().getExtras();
        if (extras != null) {
            String nameStr = extras.get("Username").toString();
            if (nameStr != null) {
                tv.setText("Hello "+nameStr);         
            }
        }
        setContentView(R.layout.main);
    }
}
  • 0
    extras.get ("Имя пользователя"), проверьте это значение, оно может быть нулевым. Смотрите в logcat.
  • 0
    Можете ли вы опубликовать журнал ошибок и макет XML здесь? Прямо сейчас это выглядит так, как будто «тв» может быть нулевым в строке.
Показать ещё 9 комментариев
Теги:
textview

2 ответа

10

Глядя на журнал ошибок, и даже лучше, глядя на сеанс отладки - можно видеть, что в строке 22 есть исключение с помощью null-указателя:

           tv.setText("Hello "+nameStr);         

Это потому, что tv == null. Он должен быть инициализирован линией:

    TextView tv = (TextView) findViewById(R.id.HelloTV);

но для использования идентификатора в макете вы всегда должны регистрировать представление в текущей активности. Эта строка должна была быть включена в начале метода onCreate:

    setContentView(R.layout.main);

Вот рабочий класс Helloworld:

public class HelloWorld extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        /*
         * Fetch and display passed string.
         */
        TextView tv = (TextView) findViewById(R.id.HelloTV);
        Bundle extras = this.getIntent().getExtras();
        if (extras != null) {
            String nameStr;
            if (extras.get("Username") != null) {
                nameStr = extras.get("Username").toString();
                tv.setText("Hello "+nameStr);           
            }
        }
    }
}

Этот класс Helloworld корректно извлекает имя пользователя из дополнительных данных, отправленных при запуске действия, и отображает персонализированное приветствие.

Я нашел ответ благодаря Константину Бурову и предыдущему вопросу здесь

0

У вас есть только один .xml файл в папке Layout проекта? если у вас есть xml файл для основной активности и один файл fragment.xml, поскольку он предлагается обновленным eclipse, вам необходимо выполнить setText внутри автоматически созданной функции onCreateView. Здесь объединен фрагмент (который содержит элементы представления) и основной макет. поэтому найдите строку ниже в своем коде или создайте ее:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {  ...   }

а затем установите текст или другие требуемые элементы вашего представления (например, btn, textView...) внутри этой функции. например:

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);

                    //set the text of textView
        TextView txvMain = (TextView) rootView.findViewById(R.id.txvMain);
        txvMain.setText("SetText works now");

                    //set a drawable as the background of the textView
        txvMain.setBackgroundResource(drawable.ic_launcher);

        return rootView;
    }

Я буду ждать дальнейших вопросов. рассматривает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню