2015-12-31 2 views
-3

У меня только вопрос об этом исключении. Я уже исправил код, но я не знал, почему я не мог использовать свой оригинальный способ.Почему я не могу вызвать startActivity для операции, созданной вручную?

public class Login extends Activity 
{ 
    EditText account, password; 

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

     account = (EditText) this.findViewById(R.id.account); 
     password = (EditText) this.findViewById(R.id.password); 

     Button_Listener listener = new Button_Listener(); 
     Button login = (Button) this.findViewById(R.id.login); 
     login.setOnClickListener(listener); 
     Button reset = (Button) this.findViewById(R.id.reset); 
     reset.setOnClickListener(listener); 
    } 

    class Button_Listener implements View.OnClickListener 
    { 
     Login l = new Login(); 

     public void onClick(View v) 
     { 
      switch(v.getId()) 
      { 
       case R.id.login: 
        if(account.getText().toString().equals("kenny")) 
        { 
         if(password.getText().toString().equals("12345")) 
         { 
          Toast.makeText(Login.this,"Welcome",Toast.LENGTH_SHORT).show(); 
          Intent go = new Intent(); 
          go.setClass(Login.this,MainMenu.class); 
          l.startActivity(go); // NullPointerException here 
          Login.this.overridePendingTransition(R.anim.enter,R.anim.exit); 
         } 
         else 
          Toast.makeText(Login.this, "Account or Password is incorrect", Toast.LENGTH_SHORT).show(); 

        } else { 
         Toast.makeText(Login.this, "Account or Password is incorrect", Toast.LENGTH_SHORT).show(); 
        } 
        break; 
       case R.id.reset: 
        account.setText(""); 
        password.setText(""); 
        break; 
      } 
     } 
    } 
} 

Почему я получаю NullPointerException на комментировал линии? Когда я использовал Login.this, я не получил это исключение.

В дополнение к этому вопросу, почему я не получил никакой ценности, если я делаю String name = account.getText().toString(); для слушателя?

+5

Вы никогда ** никогда не хотите вручную создавать события –

+0

@TimCastelijns - похоже, что слушатель кнопки является внутренним классом. Невозможно использовать 'Login.this.startActivity'? –

+0

@ cricket_007 Предпочтительным способом было бы следующее. 'V.getContext(). StartActivity (перейти)'. Не знаю, почему это еще не было предложено. – d0nut

ответ

0

Причина, по которой этот метод терпит неудачу, заключается в том, что вы не можете просто создать экземпляр действия и использовать его, как будто это активность внутри android.

Чтобы пояснить: Этот nullPointerException был выброшен из-за того, что ActivityThread не задан в вашей деятельности. Это внутреннее частное поле, которое обычно устанавливается при вызове метода активности attach (примечание: это не onAttach, а частный метод attach).

Это, в свою очередь, называется несколькими другими подсистемами, такими как ActivityThread и LocalActivityManager, все из которых у вас нет прямого управления; однако, вызываются при правильном запуске действий.

По существу, если вы хотите позвонить startActivity(Activity) вы должны убедиться, что вы вызываете его от чего-то, что является или распространяется Context и является активной частью андроида жизненного цикла (например, таких как Login.this деятельности, которая уже правильно реализованным и будучи управляемый андроидом).


Короче говоря, метод вы используете (Login.this) является правильный способ сделать это.

В будущем, в зависимости от того, где/как вы определяете класс, также правильно передать контекст в качестве аргумента в конструктор класса и использовать его там, если это необходимо.

+1

Огромное вам спасибо за помощь! :) и с Новым Годом :) – Kenlucius

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