在不工作的活动之间传递数据
passing data between activities not working
我在一个简单的应用程序中有以下场景:
1- 用户单击 MainActivity 上的菜单按钮以在全新屏幕上打开另一个 activity:addTimeActivity,他们可以在其中输入注释及其时间。
2- 新的activity有两个编辑文本:时间和备注,用户输入数据然后点击保存,或者当他们不想保存备注时可以点击取消按钮。
3- addTimeActiviy 通过意图传递数据。
4- addTimeActivity 完成。
5- 数据应该保存在一个适配器中,该适配器依次将其显示为 MainActivity 上的列表,TimeTrackerAdapter 中的 addTimeRecord 方法将字符串数据添加到时间 ArrayList。
现在,当单击保存按钮时,会出现 NullPointerException。
这是 MainActivity:
public class MainActivity extends ActionBarActivity {
ListView listView;
TimeTrackerAdapter timeTrackerAdapter;
public static final int TIME_ENTRY_REQUEST_CODE=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeTrackerAdapter=new TimeTrackerAdapter();
listView=(ListView) findViewById(R.id.recordList);
listView.setAdapter(timeTrackerAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
super.onCreateOptionsMenu(menu);
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.menu_list_item, menu);
return true;
}
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
if(requestCode==TIME_ENTRY_REQUEST_CODE)
{
if(resultCode==RESULT_OK)
{
Bundle extras=getIntent().getExtras();
String time=extras.getString("time");
String notes=extras.getString("notes");
timeTrackerAdapter.addTimeRecord(time, notes);
timeTrackerAdapter.notifyDataSetChanged();
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
if(item.getItemId()==R.id.add_time_menu_item)
{
Intent intent=new Intent(getApplicationContext(),AddTimeActivity.class);
startActivityForResult(intent,TIME_ENTRY_REQUEST_CODE);
return true;
}
return super.onOptionsItemSelected(item);
} }
这里是 addTimeActivity:
public class AddTimeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_time);
}
public void onCancel(View view)
{
finish();
}
public void onSave(View view)
{
Intent intent = new Intent(AddTimeActivity.this,MainActivity.class);
EditText editTextNotes=(EditText) findViewById(R.id.notes_edit_text);
intent.putExtra("notes",editTextNotes.getText().toString());
EditText editTextTime=(EditText) findViewById(R.id.time_edit_text);
intent.putExtra("time", editTextTime.getText().toString());
this.setResult(RESULT_OK,intent);
startActivity(intent);
finish();
}
}
适配器:
public class TimeTrackerAdapter extends BaseAdapter{
ArrayList<TimeRecord> times=new ArrayList<TimeRecord>();
TextView timeView,noteView;
@Override
public int getCount() {
// TODO Auto-generated method stub
return times.size();
}
public TimeTrackerAdapter()
{
}
@Override
public Object getItem(int index) {
// TODO Auto-generated method stub
return getItem(index);
}
@Override
public long getItemId(int index) {
// TODO Auto-generated method stub
return index;
}
public void addTimeRecord(String time,String notes)
{
TimeRecord timeRecord=new TimeRecord(time,notes);
times.add(timeRecord);
}
@Override
public View getView(int index, View view, ViewGroup parent) {
// TODO Auto-generated method stub
if(view==null)
{
LayoutInflater inflater=LayoutInflater.from(parent.getContext());
view=inflater.inflate(R.layout.time_tracker, parent,false);
}
TimeRecord time=times.get(index);
TextView timeText=(TextView) view.findViewById(R.id.timeText);
timeText.setText(time.getTime());
TextView noteText=(TextView) view.findViewById(R.id.noteText);
noteText.setText(time.getNote());
return view;
}
}
你没有初始化你的成员变量timeTrackerAdapter
!在你的 onCreate 你这样做 TimeTrackerAdapter timeTrackerAdapter=new TimeTrackerAdapter();
但应该是 timeTrackerAdapter=new TimeTrackerAdapter();
此外,您在 onActivityResult 中使用了错误的意图。应该是这样的:
protected void onActivityResult(int requestCode,int resultCode,Intent data) // Intent data is the intent that includes the data of your AddTimeActivity
{
if(requestCode==TIME_ENTRY_REQUEST_CODE)
{
if(resultCode==RESULT_OK)
{
Bundle extras=data.getExtras(); // not getIntent().getExtras()
String time=extras.getString("time");
String notes=extras.getString("notes");
timeTrackerAdapter.addTimeRecord(time, notes);
timeTrackerAdapter.notifyDataSetChanged();
}
}
}
我在一个简单的应用程序中有以下场景: 1- 用户单击 MainActivity 上的菜单按钮以在全新屏幕上打开另一个 activity:addTimeActivity,他们可以在其中输入注释及其时间。 2- 新的activity有两个编辑文本:时间和备注,用户输入数据然后点击保存,或者当他们不想保存备注时可以点击取消按钮。 3- addTimeActiviy 通过意图传递数据。 4- addTimeActivity 完成。 5- 数据应该保存在一个适配器中,该适配器依次将其显示为 MainActivity 上的列表,TimeTrackerAdapter 中的 addTimeRecord 方法将字符串数据添加到时间 ArrayList。 现在,当单击保存按钮时,会出现 NullPointerException。
这是 MainActivity:
public class MainActivity extends ActionBarActivity {
ListView listView;
TimeTrackerAdapter timeTrackerAdapter;
public static final int TIME_ENTRY_REQUEST_CODE=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeTrackerAdapter=new TimeTrackerAdapter();
listView=(ListView) findViewById(R.id.recordList);
listView.setAdapter(timeTrackerAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
super.onCreateOptionsMenu(menu);
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.menu_list_item, menu);
return true;
}
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
if(requestCode==TIME_ENTRY_REQUEST_CODE)
{
if(resultCode==RESULT_OK)
{
Bundle extras=getIntent().getExtras();
String time=extras.getString("time");
String notes=extras.getString("notes");
timeTrackerAdapter.addTimeRecord(time, notes);
timeTrackerAdapter.notifyDataSetChanged();
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
if(item.getItemId()==R.id.add_time_menu_item)
{
Intent intent=new Intent(getApplicationContext(),AddTimeActivity.class);
startActivityForResult(intent,TIME_ENTRY_REQUEST_CODE);
return true;
}
return super.onOptionsItemSelected(item);
} }
这里是 addTimeActivity:
public class AddTimeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_time);
}
public void onCancel(View view)
{
finish();
}
public void onSave(View view)
{
Intent intent = new Intent(AddTimeActivity.this,MainActivity.class);
EditText editTextNotes=(EditText) findViewById(R.id.notes_edit_text);
intent.putExtra("notes",editTextNotes.getText().toString());
EditText editTextTime=(EditText) findViewById(R.id.time_edit_text);
intent.putExtra("time", editTextTime.getText().toString());
this.setResult(RESULT_OK,intent);
startActivity(intent);
finish();
}
}
适配器:
public class TimeTrackerAdapter extends BaseAdapter{
ArrayList<TimeRecord> times=new ArrayList<TimeRecord>();
TextView timeView,noteView;
@Override
public int getCount() {
// TODO Auto-generated method stub
return times.size();
}
public TimeTrackerAdapter()
{
}
@Override
public Object getItem(int index) {
// TODO Auto-generated method stub
return getItem(index);
}
@Override
public long getItemId(int index) {
// TODO Auto-generated method stub
return index;
}
public void addTimeRecord(String time,String notes)
{
TimeRecord timeRecord=new TimeRecord(time,notes);
times.add(timeRecord);
}
@Override
public View getView(int index, View view, ViewGroup parent) {
// TODO Auto-generated method stub
if(view==null)
{
LayoutInflater inflater=LayoutInflater.from(parent.getContext());
view=inflater.inflate(R.layout.time_tracker, parent,false);
}
TimeRecord time=times.get(index);
TextView timeText=(TextView) view.findViewById(R.id.timeText);
timeText.setText(time.getTime());
TextView noteText=(TextView) view.findViewById(R.id.noteText);
noteText.setText(time.getNote());
return view;
}
}
你没有初始化你的成员变量timeTrackerAdapter
!在你的 onCreate 你这样做 TimeTrackerAdapter timeTrackerAdapter=new TimeTrackerAdapter();
但应该是 timeTrackerAdapter=new TimeTrackerAdapter();
此外,您在 onActivityResult 中使用了错误的意图。应该是这样的:
protected void onActivityResult(int requestCode,int resultCode,Intent data) // Intent data is the intent that includes the data of your AddTimeActivity
{
if(requestCode==TIME_ENTRY_REQUEST_CODE)
{
if(resultCode==RESULT_OK)
{
Bundle extras=data.getExtras(); // not getIntent().getExtras()
String time=extras.getString("time");
String notes=extras.getString("notes");
timeTrackerAdapter.addTimeRecord(time, notes);
timeTrackerAdapter.notifyDataSetChanged();
}
}
}