第一篇博客,不是为了什么分享,只是为了强迫自己去整理踩过的坑,工作了,要在一点一滴中总结进步。
---写在前面的话。
正文:
学习安卓开发中遇到一个问题:关于界面(activity)间跳转并传值的问题。
界面A中有两个Button(记为Button1和Button2),都跳转到界面B,但Button1没有值的传递,而Button2中包含了值的传递。两者的代码如下:
Button1的代码:dialogButton
final Button dialogButton = (Button)findViewById(R.id.Button4);//获得句柄
//设置监听
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this,TestDialog.class);//设置跳转关系
startActivity(intent);
}
});
Button2的代码:intentButon
final Button intentButton = (Button)findViewById(R.id.Button5);//获得句柄
intentButton.setOnClickListener(new View.OnClickListener() {//设置监听
@Override
public void onClick(View v) {
Bundle datain = new Bundle();
datain.putString("name",editText.getText().toString());//putString(<k,v>)存入的是Map类似的数据,键值对
datain.putInt("flag",1);//区别的关键,缺少该句会报错
Intent intent = new Intent(MainActivity.this,TestDialog.class);
intent.putExtras(datain);
startActivity(intent);
}
});
Button2的监听是将EditText控件中的输入文本传到TestDialog界面显示;Button1只是简单的跳转。
逻辑:
为了在TestDialog中接收Button2传过来的值,其代码为:
final TextView tv = (TextView)findViewById(R.id.TextViewIntentOut);//获得用来显示信息的控件
Intent intent = getIntent();
//tv.setText(intent.getExtras().getString("name"));
try{
if(intent.getExtras() != null){ if (intent.getExtras().getInt("flag") == 1) tv.setText(intent.getExtras().getString("name"));//显示传递过来的信息,getString();根据键,取值 } }catch (NullPointerException e){ e.printStackTrace(); return; }这是正确的代码编写方案,错误的如下:
final TextView tv = (TextView)findViewById(R.id.TextViewIntentOut);//获得用来显示信息的控件
Intent intent = getIntent();
tv.setText(intent.getExtras().getString("name"));
即:直接设置TextView控件的值。这样的代码,当触发Button2时可以正常运行,但是当触发Button1时则会报错。为记录具体,错误信息如下:
FATAL EXCEPTION: main
Process: com.crsh.myapplication, PID: 14201
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.migu.crsh.myapplication/com.migu.crsh.myapplication.TestDialog}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773)
at android.app.ActivityThread.access$900(ActivityThread.java:186)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1597)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5884)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1099)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:865)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at com.migu.crsh.myapplication.TestDialog.onCreate(TestDialog.java:39)
at android.app.Activity.performCreate(Activity.java:6200)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2640)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773)
at android.app.ActivityThread.access$900(ActivityThread.java:186)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1597)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5884)
其实,图片可能直观点:
原因是:调用intent.getExtras();时,根本没有传入Bundle对象,自然获取不得,返回结果为null。
综上:通过
new Bundle().putInt("flag",flagValue);
设置不同的flag与值,再在结果界面(activity)中判断。可知是哪个按钮触发的跳转。
结尾:处女博客完成,略开心。每天进步一点就好。