책과 인터넷 자료를 보면서 만들고 있는데요. 똑같이 실행시켜도 에러가 나네요...;;
저는 intent를 이용해서 액티비티간 데이터 받기를 하고 싶습니다.
다음과 같은 코드를 실행시키면 입력을 받고 넘겨줄 때"...unexpectedly stopped.." 경고창이 나오면서 강제 종료됩니다.
(=두번째 페이지에서 첫번째 페이지로 돌아갈 때 강제종료됩니다..)
제가 보기엔 괜찮은데 왜 그럴까요?
꼭 좀 도와주세요..!!ㅠ.ㅠ
(참고)
첫번째 페이지에서 버튼을 클릭하면 다음 페이지로 넘어갑니다.
두번째 페이지에서 정보를 입력 받습니다. 입력받은 정보를 다시 첫번째 페이지로 넘겨주려고 합니다.
1. Walking7.java : 메인 액티비티
---------------------------------------------------------------------------------------------------------------------------------------
public class Walking7 extends Activity {
// 버튼을 클릭하면 다음페이지로 이동함.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button myinfo = (Button)findViewById(R.id.myinfo);
myinfo.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent(Walking7.this,Walking_myinfo.class);
startActivityForResult(intent, 1);
}
});
}
// 입력된 값을 받아 출력함
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
TextView name_view = (TextView)findViewById(R.id.age);
TextView digit_view = (TextView)findViewById(R.id.height);
if( resultCode == RESULT_OK){
if( requestCode == 1) {
name_view.setText(data.getStringExtra("data_age"));
digit_view.setText(data.getStringExtra("data_height"));
}
}
}
}
2. Walking_myinfo.java : 호출된 액티비티(서브액티비티) : 입력을 받고 다시 메인 액티비티로 넘겨줌
-----------------------------------------------------------------------------------------------------------------------------------------
public class Walking_myinfo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myinfo);
Button input_info = (Button)super.findViewById(R.id.save1);
input_info.setOnClickListener(new Button.OnClickListener() {
public void onClick(View view){
Intent intent = getIntent();
EditText name_input = (EditText)findViewById(R.id.age);
EditText digit_input = (EditText)findViewById(R.id.height);
intent.putExtra("data_age", name_input.getText().toString());
intent.putExtra("data_height", digit_input.getText().toString());
setResult(RESULT_OK, intent);
finish();
}
});
}
}
메니패스트 파일
--------------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.corea.Walking7"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Walking7"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="Walking_myinfo"></activity>
</application>
</manifest>
LogCat 화면
------------------------------------------------------------------------------------------------------------------------------------------------------------------
05-24 03:46:24.771: ERROR/AndroidRuntime(373): FATAL EXCEPTION: main
05-24 03:46:24.771: ERROR/AndroidRuntime(373): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { cmp=com.corea.Walking7/.Walking_myinfo (has extras) }} to activity {com.corea.Walking7/com.corea.Walking7.Walking7}: java.lang.NullPointerException
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread.access$2800(ActivityThread.java:125)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.os.Handler.dispatchMessage(Handler.java:99)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.os.Looper.loop(Looper.java:123)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at java.lang.reflect.Method.invokeNative(Native Method)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at java.lang.reflect.Method.invoke(Method.java:521)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at dalvik.system.NativeStart.main(Native Method)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): Caused by: java.lang.NullPointerException
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at com.corea.Walking7.Walking7.onActivityResult(Walking7.java:36)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.Activity.dispatchActivityResult(Activity.java:3890)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
05-24 03:46:24.771: ERROR/AndroidRuntime(373): ... 11 more
05-24 03:46:24.911: WARN/ActivityManager(39): Force finishing activity com.corea.Walking7/.Walking7
05-24 03:46:25.711: WARN/ActivityManager(39): Activity pause timeout for HistoryRecord{43f2bf38 com.corea.Walking7/.Walking7}
그냥 StartActivity()로 시작해버리는겁니다. a에서 버튼을 눌럿을때 b를 포리절트 말고 그냥 시작시켜버리고 finish 날려버리고 b에서는 입력받은후 intent에 값언져서 보내는거죠.
이럴경우 최초 a가 실행될때 getintent로 값을 받아서 set하는 부분이 들어가게되는데 받은값이 없으면 텍스트뷰나 에디트텍스트등에 값을 set 하려다가 액티비티가 사망하게 됩니다.
그래서 if문을 하나 추가해서 예로
a Activity 초기에
Intent s = getIntent();
String test = s.getStringExtra("test");
if(null == test){
나머지값 받고
값 셋팅
} else {
그냥 기본실행시 기능정의
}
요런식으로 해서 썻던경우가 많습니다.
주로 db데이터 불러와서 등록,수정을 한페이지에서 사용시에 뷰 gone 설정등과 함께 사용했던경우가 몇번 있던거 같네요.
해결 하셨지만 저같은경우 요래 쓸경우가 있더군요.
자 그럼 a activity
public class a extends Activity {
String test;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
Intent s = getIntent();
test = s.getStringExtra("test");
if(null == test){
//엑티비가 b에서 호출되지 않고 그냥 실행시 처리
} else {
// 엑티비티가 b에서 호출됬을시 기능정의
// 예로 다른 값들도 전달받고 해당 값들을 뷰에 셋해주거나 하는처리 해주시면됩니다.
}
//a에서 b로 넘어갈 버튼
Button goTo_b= (Button)findViewById(R.id.goTo_b);
goTo_b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(a.this, b.class));
finish();
}
});
}
}
대략 이런식으로 a에서 b로 옴겨가시거나 b에서 a를 호출했을때 처리해줘버리시고.
public class b extends Activity {
EditText testdata;
String test;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
testdata = (EditText)findViewById(R.id.testdata);
test = String.valueOf(testdata.getText());
//b에서 a로 넘어갈 버튼
Button goTo_a= (Button)findViewById(R.id.goTo_a);
goTo_a.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent s = new Intent();
s.putExtra("test", test);
startActivity(s);
}
});
}
}
이런느낌으로.. 하면 될거 같네요. 치다보니 오타가 있을수가 있다는..
data.getStringExtra("data_age") != null &&
data.getStringExtra("data_height") != null
이걸 if로 추가해보세요
정확하게 at com.corea.Walking7.Walking7.onActivityResult(Walking7.java:36) 이부분이 어디죠?
name_view.setText(data.getStringExtra("data_age"));
여기 아닌가요?




그냥 호출하시고 a에서 버튼으로 b를 호출하면 b에서 입력받은 데이터를 intent.putExtra()로 쏘시고
a에서는 값을 받되 if문을 통해 넘어오는 값이 null일때 즉 그냥 최초 b를 호출하기전 a가 실행되는 상태에서 오류가 나지 않도록 구성을 많이 해왔는데.. 이런방식도 생각해 보세용~