单击 return 按钮时应用程序崩溃
App crashed when the return button is clicked
我正在尝试将值 k 从 Activity A 传递给 B。单击 activity B 中的保存 button
时,它会将值 k 传递给 Activity又是A。但是如果我想 return 回到 A,应用程序崩溃了。
ActivityA
中的一些代码片段
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
Intent intent = new Intent(getActivity().getApplicationContext(), Project1.class);
intent.putExtra("k",k);
startActivityForResult(intent, 0);
} else if (item == 1) {
Intent intent = new Intent(getActivity().getApplicationContext(), Petrol.class);
intent.putExtra("k", k);
startActivityForResult(intent, 1);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
int button = data.getIntExtra("k1", 0);
if (button == 1) {
switch (requestCode) {
case 0:
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
as=Long.parseLong(result);
c.setText(" " + b + "------" + "RM " + result);
break;
case 1:
String result1 = data.getStringExtra("text");
String b1 = data.getStringExtra("a");
as1=Long.parseLong(result1);
c.setText(" " + b1 + "------" + "RM " + result1);
break;
}
}
else if(button==2)
{
switch (requestCode) {
case 0:
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
bs=Long.parseLong(result);
d.setText(" " + b + "------" + "RM " + result);
break;
case 1:
String result1 = data.getStringExtra("text");
String b1 = data.getStringExtra("a");
bs1=Long.parseLong(result1);
d.setText(" " + b1 + "------" + "RM " + result1);
break;
}
}
ActivityB
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.project);
txt= (EditText)findViewById(R.id.editText36);
Button b=(Button)findViewById(R.id.button17);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent returnIntent = new Intent();
a="Project";
text = txt.getText().toString();
returnIntent.putExtra("text", text);
returnIntent.putExtra("a", a);
final int k1 = getIntent().getExtras().getInt("k");
returnIntent.putExtra("k1", k1);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
}
@Override
public void onBackPressed()
{
Intent intent = new Intent(Project1.this, Claims.class);
startActivity(intent);
finish();
}
LogCat 错误
10-28 15:55:26.612 3641-3641/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.project, PID: 3641
java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=2, result=0, data=null} to activity {com.example.project.project/com.example.project.project.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
最新错误
10-28 16:54:56.150 6381-6381/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.project, PID: 6381
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.project.project/com.example.project.project.Claims}: java.lang.ClassCastException: com.example.project.project.Claims cannot be cast to android.app.Activity
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.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)
我确实喜欢@we are borg 的建议,并在 mainfest.xml 中声明了 activity A (claims.java),但出现了如上的错误
谢谢大家...我喜欢这个并且解决了:)
Activity一个
声明 public static final int CAMERA_REQUEST_CODE = 6;
添加 else if(requestCode==CAMERA_REQUEST_CODE) {}after else if(button==5){}
ActivityB
使用
@Override
public void onBackPressed()
{
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
}
代替@Override
public void onBackPressed()
{
Intent intent = new Intent(Project1.this, Claims.class);
startActivity(intent);
finish();
}
在您的 class 中添加此功能:
@Override
public void onBackPressed() {
Intent intent = new Intent(CurrentClass.this, DestinationActivity.class);
startActivity(intent);
finish();
}
我希望这是你要找的,如果不是,我会删除答案,请发表评论。
我认为 'null object reference' 即将到来是因为 getActivity()
。
检查 getActivity()
是否不返回空值,如果它不是使用上下文。
或者创建一个单例对象。
当您按下后退按钮时,默认结果代码将为 RESULT_CANCEL 并且返回意图将为空。
您需要在 onActivityResult 中检查它或覆盖 activity B 中的方法 onBackPressed 并设置必要的结果值。
已编辑:
按以下方式覆盖 onBackPressed (activity B)
@Override
public void onBackPressed() {
Intent returnIntent = new Intent();
a="Project";
text = txt.getText().toString();
returnIntent.putExtra("text", text);
returnIntent.putExtra("a", a);
final int k1 = getIntent().getExtras().getInt("k");
returnIntent.putExtra("k1", k1);
setResult(Activity.RESULT_OK, returnIntent);
super.onBackPressed();
}
在这种情况下,您将发回必要的结果值。
如果您不想在按下后退按钮时发送任何值,您可以在 onActivityResult
中查看结果代码
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// int button = data.getIntExtra("k1", 0); // data could be null. and here you are getting NullPointerException
// if (button == 1) {
switch (requestCode) {
case 0:
if (resultCode == RESULT_OK) {
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
as=Long.parseLong(result);
c.setText(" " + b + "------" + "RM " + result);
} else if (resultCode == RESULT_CANCEL) {
// TODO other functionality - when you do not override onBackPressed in activity B
}
break;
...
}
}
好吧,无耻地从http://developer.android.com/training/basics/intents/result.html的官方文档中复制粘贴:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
确保您的代码中有 if (resultCode == RESULT_OK)
行。如果 (resultCode == RESULT_CANCELED)
,则没有结果可用,Intent
为 null
。
当您按下设备上的 "back" 按钮时,正常结果是取消当前 activity,因此调用 activity 得到 resultCode
RESULT_CANCELED
在这种情况下,而不是通过 finish()
.
显式返回时设置的那个
我正在尝试将值 k 从 Activity A 传递给 B。单击 activity B 中的保存 button
时,它会将值 k 传递给 Activity又是A。但是如果我想 return 回到 A,应用程序崩溃了。
ActivityA
中的一些代码片段 public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
Intent intent = new Intent(getActivity().getApplicationContext(), Project1.class);
intent.putExtra("k",k);
startActivityForResult(intent, 0);
} else if (item == 1) {
Intent intent = new Intent(getActivity().getApplicationContext(), Petrol.class);
intent.putExtra("k", k);
startActivityForResult(intent, 1);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
int button = data.getIntExtra("k1", 0);
if (button == 1) {
switch (requestCode) {
case 0:
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
as=Long.parseLong(result);
c.setText(" " + b + "------" + "RM " + result);
break;
case 1:
String result1 = data.getStringExtra("text");
String b1 = data.getStringExtra("a");
as1=Long.parseLong(result1);
c.setText(" " + b1 + "------" + "RM " + result1);
break;
}
}
else if(button==2)
{
switch (requestCode) {
case 0:
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
bs=Long.parseLong(result);
d.setText(" " + b + "------" + "RM " + result);
break;
case 1:
String result1 = data.getStringExtra("text");
String b1 = data.getStringExtra("a");
bs1=Long.parseLong(result1);
d.setText(" " + b1 + "------" + "RM " + result1);
break;
}
}
ActivityB
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.project);
txt= (EditText)findViewById(R.id.editText36);
Button b=(Button)findViewById(R.id.button17);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent returnIntent = new Intent();
a="Project";
text = txt.getText().toString();
returnIntent.putExtra("text", text);
returnIntent.putExtra("a", a);
final int k1 = getIntent().getExtras().getInt("k");
returnIntent.putExtra("k1", k1);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
}
@Override
public void onBackPressed()
{
Intent intent = new Intent(Project1.this, Claims.class);
startActivity(intent);
finish();
}
LogCat 错误
10-28 15:55:26.612 3641-3641/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.project, PID: 3641
java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=2, result=0, data=null} to activity {com.example.project.project/com.example.project.project.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
最新错误
10-28 16:54:56.150 6381-6381/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.project, PID: 6381
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.project.project/com.example.project.project.Claims}: java.lang.ClassCastException: com.example.project.project.Claims cannot be cast to android.app.Activity
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.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)
我确实喜欢@we are borg 的建议,并在 mainfest.xml 中声明了 activity A (claims.java),但出现了如上的错误
谢谢大家...我喜欢这个并且解决了:)
Activity一个
声明 public static final int CAMERA_REQUEST_CODE = 6;
添加 else if(requestCode==CAMERA_REQUEST_CODE) {}after else if(button==5){}
ActivityB
使用
@Override
public void onBackPressed()
{
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
}
代替@Override
public void onBackPressed()
{
Intent intent = new Intent(Project1.this, Claims.class);
startActivity(intent);
finish();
}
在您的 class 中添加此功能:
@Override
public void onBackPressed() {
Intent intent = new Intent(CurrentClass.this, DestinationActivity.class);
startActivity(intent);
finish();
}
我希望这是你要找的,如果不是,我会删除答案,请发表评论。
我认为 'null object reference' 即将到来是因为 getActivity()
。
检查 getActivity()
是否不返回空值,如果它不是使用上下文。
或者创建一个单例对象。
当您按下后退按钮时,默认结果代码将为 RESULT_CANCEL 并且返回意图将为空。
您需要在 onActivityResult 中检查它或覆盖 activity B 中的方法 onBackPressed 并设置必要的结果值。
已编辑:
按以下方式覆盖 onBackPressed (activity B)
@Override
public void onBackPressed() {
Intent returnIntent = new Intent();
a="Project";
text = txt.getText().toString();
returnIntent.putExtra("text", text);
returnIntent.putExtra("a", a);
final int k1 = getIntent().getExtras().getInt("k");
returnIntent.putExtra("k1", k1);
setResult(Activity.RESULT_OK, returnIntent);
super.onBackPressed();
}
在这种情况下,您将发回必要的结果值。
如果您不想在按下后退按钮时发送任何值,您可以在 onActivityResult
中查看结果代码public void onActivityResult(int requestCode, int resultCode, Intent data) {
// int button = data.getIntExtra("k1", 0); // data could be null. and here you are getting NullPointerException
// if (button == 1) {
switch (requestCode) {
case 0:
if (resultCode == RESULT_OK) {
String result = data.getStringExtra("text");
String b = data.getStringExtra("a");
as=Long.parseLong(result);
c.setText(" " + b + "------" + "RM " + result);
} else if (resultCode == RESULT_CANCEL) {
// TODO other functionality - when you do not override onBackPressed in activity B
}
break;
...
}
}
好吧,无耻地从http://developer.android.com/training/basics/intents/result.html的官方文档中复制粘贴:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
确保您的代码中有 if (resultCode == RESULT_OK)
行。如果 (resultCode == RESULT_CANCELED)
,则没有结果可用,Intent
为 null
。
当您按下设备上的 "back" 按钮时,正常结果是取消当前 activity,因此调用 activity 得到 resultCode
RESULT_CANCELED
在这种情况下,而不是通过 finish()
.