2016-04-06 4 views
1

Я просто тестирование ввода/вывода, не было никакого специального назначения, это последний код, который выполняется успешно:Почему Android-приложение вылетает для инициализации переменной с помощью findViewById (R.id. ******) в начале класса?

public class MainActivity extends AppCompatActivity 
{ 

/* 
EditText username = (EditText)findViewById(R.id.editText_Username); 
EditText password = (EditText)findViewById(R.id.editText_Password); 
TextView inputdata = (TextView)findViewById(R.id.textView_InputData); 
TextView welcome = (TextView)findViewById(R.id.textView_Welcome); 
Button login=(Button)findViewById(R.id.button_Login); 
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another); 

public void doLoginOnClick(View v) 
{ 
    String s1=username.getText().toString(); 
    inputdata.setText(s1); 
} 

*/ 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
} 

} 

Я пытаюсь захватить идентификатор компонента с использованием

findViewById(R.id.***)

как вы можете видеть, я помещаю этот код в комментарий в самом начале кода.

EditText username = (EditText)findViewById(R.id.editText_Username); 
EditText password = (EditText)findViewById(R.id.editText_Password); 
TextView inputdata = (TextView)findViewById(R.id.textView_InputData); 
TextView welcome = (TextView)findViewById(R.id.textView_Welcome); 
Button login=(Button)findViewById(R.id.button_Login); 
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another); 

Если удалить комментарий выше и запустить его (как в эмуляторе и реальном устройстве), программа падает сразу, я удивлен, что здесь не так?

Даже я попытался инициализировать то же самое, используя конструктор.

Но если я положил его внутри onCreate(), то нет аварии? Зачем?

Я пытался извлечь информацию из имени пользователя и пароля и отображать его на TextView в textView_Inputdata используя

EditText username = (EditText)findViewById(R.id.editText_Username); 
EditText password = (EditText)findViewById(R.id.editText_Password); 
TextView inputdata = (TextView)findViewById(R.id.textView_InputData); 
inputdata.setText(username.getText.toString()+" "+password.getText.toString()); 

Есть ли лучше или более простой способ сделать это?

+0

Без какой-либо stacktrace я ставлю его nullPointerException, вызванное findViewById, возвращающим значение null, вызванное отсутствием макета. Вызовите его после setContentView(). – Nanoc

ответ

5

Элементы-члены экземпляра инициализируются при инициализации самого экземпляра. Слишком рано для findViewById()

До onCreate() Ваша деятельность еще не имеет Window, что findViewById() нуждается во внутреннем пространстве. До setContentView() (который вы должны звонить в onCreate()), нет никаких видов, которые можно найти.

Поэтому запустите свой просмотр ссылок в onCreate() и после setContentView().

+0

спасибо, теперь я понял – 000

0

Добавьте этот код

`EditText username = (EditText)findViewById(R.id.editText_Username); 
EditText password = (EditText)findViewById(R.id.editText_Password); 
TextView inputdata = (TextView)findViewById(R.id.textView_InputData); 
TextView welcome = (TextView)findViewById(R.id.textView_Welcome); 
Button login=(Button)findViewById(R.id.button_Login); 
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);` 

в OnCreate() метод после setContentView (R.layout.activity_main)

+0

он работает, спасибо. – 000

0

Эй, я вижу, что вы определяете и инициализации переменных экземпляра. То, что я делаю, я определить переменный экземпляр - EditText username, а затем в методе onCreate я инициализирую их - username = (EditText) findViewById(R.id.editText_Username);

Причины вы не инициализировать переменный экземпляр, потому что элементы не готовы пока после того, как setContentView в onCreate метод - я мог ошибаться в этом, но моя лучшая практика определяет переменную экземпляра, а затем инициализирует их в методе onCreate.

+0

Вы предлагаете мне следовать этому как хорошую практику? – 000

+0

Да, я предлагаю, чтобы это объявление было очень эффективным – Dan

0

Перед настройкой setContentView() вы не сможете инициализировать элементы вида. Поскольку просмотр не будет существует для деятельности в то время.

Сохраните инициализацию в одном отдельном методе и вызовите этот метод после установки вида в действие.