2016-02-12 31 views
0

我想在android studio中制作一个To Do应用程序。但只要我点击添加按钮(+在右上角)应用程序崩溃。我很新的Java和Android的工作室,但我认为这个问题可以躺在“saveListInfo()”,但我无法弄清楚如何解决它......要做应用程序崩溃

代码从EditedActivity.java:

public class EditedActivity extends AppCompatActivity { 

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

     String name; 
     name = getIntent().getStringExtra("theName"); 

     EditText editList = (EditText) findViewById(R.id.editText); 
     editList.setText(name); 
    } 


    private void saveListInfo() { 
     EditText editList = (EditText) findViewById(R.id.editText); 
     String name = editList.getText().toString(); 

     Bundle listBundle = new Bundle(); 
     listBundle.putString("name", name); 

     Intent finalIntent = new Intent(this, MainActivity.class); 
     finalIntent.putExtras(listBundle); 

     setResult(RESULT_OK, finalIntent); 

    } 

    Button addBtn = (Button) findViewById(R.id.add_btn); 

    { 
     addBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       saveListInfo(); 
      } 
     }); 
    } 
} 
从MainActivity.java

代码:

public class MainActivity extends AppCompatActivity { 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_add_task: 
       saveTodoInfo(); 

     } 

     return true; 
    } 

    private void saveTodoInfo(){ 
     TextView nameView = (TextView) findViewById(R.id.action_add_task); 
     String name = nameView.getText().toString(); 

     Intent myIntent = new Intent(this, EditedActivity.class); 
     myIntent.putExtra("theName", name); 

     startActivityForResult(myIntent, 0); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 0){ 
      if(resultCode == RESULT_OK){ 
       Bundle ListBundle = data.getExtras(); 
       String name = ListBundle.getString("theName"); 

       updateToDo(name); 
      } 
     } 

    } 

    private void updateToDo(String name){ 
     TextView nameView = (TextView) findViewById(R.id.action_add_task); 
     nameView.setText(name); 
    } 


} 

这是点击添加按钮时,我得到的错误:

02-12 16:07:40.553 1410- 1410/com.carpe_diem.anitas_todolist E/AndroidRuntime:致命异常:主 工艺:com.carpe_diem.anitas_todolist,PID:1410 了java.lang.RuntimeException:无法实例活动 ComponentInfo {com.carpe_diem.anitas_todolist/COM。 carpe_diem.anitas_todolist.EditedActivity}: 显示java.lang.NullPointerException:尝试在 android.app上一个空 对象引用 调用虚拟方法 'android.view.View android.view.Window.findViewById(INT)'。 ActivityThread.performLaunchActivity(ActivityThread.java:2327) at android.app.ActivityThread.handleLaunchActivity(Activity Thread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage( Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(本地方法) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 由于:java.lang.NullPointerException:尝试调用虚拟 方法'android.view.View android.view.Window.findViewById(int)'在 空对象引用 at android.app.Activity.findViewById(Activity的.java:2090) 在 com.carpe_diem.anitas_todolist.EditedActivity(EditedActivity.java:40) 在java.lang.Class.newInstance(本机方法) 在android.app.Instrumentation.newActivity(Instrumentation.java: 1067) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java .lang.reflect.Method。调用(本地方法) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

+1

我想知道为什么这个问题被关闭为重复只是因为指示“NullPointerException” – Jorgesys

回答

1

通过日志,我们可以看到,你崩溃是在下面的行发生的事情:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference at 
android.app.Activity.findViewById(Activity.java:2090) at 
com.carpe_diem.anitas_todolist.EditedActivity.(EditedActivity.java:40) 
... 

后检查你的代码,我可以在第40行(EditedActivity.java:40)中发现下面的代码不在任何方法或函数中。

Button addBtn = (Button) findViewById(R.id.add_btn); 
{ 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

所以,你必须将上面的行移动到onCreate()方法。

EditedActivity.java

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

    String name; 
    name = getIntent().getStringExtra("theName"); 

    EditText editList = (EditText) findViewById(R.id.editText); 
    editList.setText(name); 

    Button addBtn = (Button) findViewById(R.id.add_btn); 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

根源

如果您在下面留下任何方法的行外,将对象实例化过程中运行。

Button addBtn = (Button) findViewById(R.id.add_btn); 

但是,在创建对象时,视图还没有创建。所以,findViewById不会找到任何东西,并会返回null。因此,该CRASH(或强制关闭)将发生。

解决方案

因此,确保添加findViewById()一个视图已经创建后调用方法中(否则,它会永远找不到的观点)。如你所见,我建议在setContentView(R.layout.activity_edited)之后添加onCreate()方法(它负责将对象添加到VIEW中)。

在那一行之后,findViewById()将能够找到视图(当然,如果您将它们添加到布局中)。

+0

谢谢!这似乎是做伎俩:) – anita

1

删除解决此代码括号

{ 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveListInfo(); 
     } 
    }); 
} 

应该是这样的

Button addBtn = (Button) findViewById(R.id.add_btn); 
addBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     saveListInfo(); 
    } 
}); 

如果你想知道为什么事故发生,你可以阅读更多关于What is an initialization block?