2010-09-13 5 views
1

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

Я пробовал остальную часть своего кода, но ... Почему моя сила приложения закрывается, когда я добавляю строку «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 («Username»), отметьте это значение, это может быть нулевое значение. См. В logcat. – bhups

+0

Можете ли вы разместить журнал ошибок и xml-макет здесь? Прямо сейчас, похоже, что «tv» может быть нулевым на линии. –

+0

@bhups - Я проверяю имя пользователя, не так ли? - if (nameStr! = null) ... – Dizzley

ответ

10

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

  tv.setText("Hello "+nameStr);   

Это потому, что телевидение = = 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 правильно извлекает имя пользователя из массовки, посланной, когда начинается деятельность и отображает персонализированное приветствие.

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

0

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

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

, а затем установить текст или другие необходимые элементы вашего зрения (например, БТН, 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; 
    } 

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

Смежные вопросы