2013-07-18 3 views
-2

Кажется, что я нахожусь в силе, когда я запускаю приложение на своем Nexsus 4. Большая вероятность того, что он только меня обманывает, но я не могу найти что-то не так с кодом.Базовая отладка для Android

Android Studio не дает эррос. Метод сброса, который закомментирован, я должен сбросить флажок и TextView.

Почему я не могу определить элементы перед onCreate? И когда я определяю их после того, как я не смогу использовать их в методе «сброса».

Может ли кто-нибудь посмотреть?

package com.example.myapplication; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.TextView; 
public class MainActivity extends Activity { 

    final TextView txtTest = (TextView) findViewById(R.id.txtOut); 
    final CheckBox chkTest = (CheckBox) findViewById(R.id.chkTest); 
    final Button btnTest = (Button) findViewById(R.id.btnTest); 
    final EditText etTest = (EditText) findViewById(R.id.etTest); 
    String text = ""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      chkTest.setChecked(true); 

      chkTest.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
          if (chkTest.isChecked()) { 
            txtTest.setText("Checked :)"); 
          } else txtTest.setText("Not Checked"); 
        } 
      }); 

      btnTest.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
          //etTest.getText().toString(text); 
          text = etTest.toString(); 
         // Reset(text); 
        } 
      }); 
      /*void Reset(String text) { 
        chkTest.setChecked(false); 
        txtTest.setText(text); 
      }*/ 
    } 

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

Это ошибка LogCat:

java.lang.RuntimeException: Unable to instantiate activity 
ComponentInfo{[...].MyActivity}: java.lang.NullPointerException 
+0

некоторые logcat для масс – thepoosh

+0

См. Мой ответ ниже, homever, это лучше для вас, если вы сначала улучшите свои знания о Java-программировании, а также о программировании в Android. – lory105

ответ

4

Вы не можете инициализировать элемент таким образом! Макет еще не завышен, когда выполняется код final TextView txtTest = (TextView) findViewById(R.id.txtOut);, поэтому у вас есть исключение с нулевым указателем. Кроме того, определите метод reset() вне функции onCreate(). Смотрите коды ниже:

TextView txtTest = null; 
    CheckBox chkTest = null; 
    Button btnTest = null; 
    EditText etTest = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    txtTest = (TextView) findViewById(R.id.txtOut); 
    chkTest = (CheckBox) findViewById(R.id.chkTest); 
    btnTest = (Button) findViewById(R.id.btnTest); 
    etTest = (EditText) findViewById(R.id.etTest); 

    .... 
} 


void reset(String text) { 
     chkTest.setChecked(false); 
     txtTest.setText(text); 
} 
0

Вы не можете вызвать элементы вашего инициализируем находится на activity_main.xml и установить вид контента после инициализации. Сделайте инициализацию в onCreate().

2

Вы не можете найти точку зрения, когда еще не создан, попробуйте следующее:

package com.example.myapplication; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.TextView; 
public class MainActivity extends Activity { 

    TextView txtTest = null; 
    CheckBox chkTest = null; 
    Button btnTest = null; 
    EditText etTest = null; 
    String text = ""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      txtTest = (TextView) findViewById(R.id.txtOut); 
      chkTest = (CheckBox) findViewById(R.id.chkTest); 
      btnTest = (Button) findViewById(R.id.btnTest); 
      etTest = (EditText) findViewById(R.id.etTest); 


      chkTest.setChecked(true); 

      chkTest.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
          if (chkTest.isChecked()) { 
            txtTest.setText("Checked :)"); 
          } else txtTest.setText("Not Checked"); 
        } 
      }); 

      btnTest.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
          //etTest.getText().toString(text); 
          text = etTest.toString(); 
         // Reset(text); 
        } 
      }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
    } 
    private void Reset(String text) { 
      chkTest.setChecked(false); 
      txtTest.setText(text); 
    } 

} 
+0

Спасибо! Что вы в основном делаете, это установить их как null, чтобы код восстановления мог их достичь? – Dukes

+0

вам нужно объявить его на уровне класса, чтобы увидеть его в методе сброса (см. Я изменил область применения этого метода). Вам нужно установить его в null, потому что на уровне объявления класса, представление еще не было завышено (создано), оно создается в onCreate – surfealokesea

0

Во-первых, вы должны определить функцию Reset() вне onCreate(). Это не правильный путь. Во-вторых, я наблюдаю, что вы только что начали, поэтому я бы предложил определить views в xml, а затем действовать на них. Вы можете сначала установить значение checkbox true в xml, а позже установить в поле значение false.

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