two라는 클래스는 이미지가 두개 있습니다.
이미지1을 누르면 input클래스로 이동하고 input클래스에서는 edittext를 만들어 문자를 입력할수 했습니다
입력한 문자는 two클래스의 이미지1밑에 있는 edittext박스에 출력됩니다.
그런다음 이미지2를 누르고 input클래스로 이동하여 edittext박스에 문자를 입력하고 ok를 누르면
two클래스의 이미지2 밑에 있느 edittext박스에 출력이 되는데 , 이때 이미지1밑에 있는 edittext박스에 출력되었던 내용이 사라지면서
이미지2밑에 있는 edittext박스에 출력됩니다.
기존의 이미지1밑에 있던 내용을 유지하면서 이미지2밑에 문자를 출력하고싶은데 어찌해야하나요???
putStringArrayListExtra을 사용하면 된다고하던데 완전초보라서 감을 못잡겠네요ㅠㅠ
two.java
package aa.com;
import android.app.*;
import android.content.*;
import android.os.*;
import android.provider.ContactsContract.*;
import android.view.*;
import android.widget.*;
public class Two extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.two); //two 레이아웃 호출
//EditText editText1 = (EditText)findViewById(R.id.text1);
EditText text1 = (EditText)findViewById(R.id.text1);
EditText text2 = (EditText)findViewById(R.id.text2);
ImageView one1 = (ImageView) findViewById(R.id.ant); // ant을 ImageView형식으로 호출
one1.setOnClickListener(new ImageView.OnClickListener() { // 버튼이벤트 받아들일준비
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
Intent intent = new Intent(Two.this, input.class); // intent클래스에 input클래스 추가
intent.putExtra(input.first, "first");
startActivityForResult(intent, 0);
//startActivity(intent);// intent시작
}
});
// EditText editText2 = (EditText)findViewById(R.id.text2);
ImageView one2 = (ImageView) findViewById(R.id.butterfly); // butteryfly을 ImageView형식으로 호출
one2.setOnClickListener(new ImageView.OnClickListener() { // 버튼이벤트 받아들일 준비
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Two.this, input.class); // intent클래스에 input클래스 추가
intent.putExtra(input.first, "second");
startActivityForResult(intent,0);
//startActivity(intent);// intent시작
}
});
Intent intent1= getIntent();
String st1 = intent1.getStringExtra("text1");
text1.setText(st1);
Intent intent2= getIntent();
String st2 = intent2.getStringExtra("text2");
text2.setText(st2);
}
}
----
input.java
package aa.com;
import android.app.*;
import android.content.*;
import android.os.*;
import android.util.Log;
import android.view.*;
import android.widget.*;
public class input extends Activity {
public static final String first = "";
String a="";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.input); //input 레이아웃 호출
// TODO Auto-generated method stub
ImageView ok = (ImageView) findViewById(R.id.ok); // ok을 ImageView형식으로 호출
a = getIntent().getStringExtra(first);
Log.d("sysout", a);
ok.setOnClickListener(new ImageView.OnClickListener() { // 버튼이벤트 받아들일준비
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(a.equals("first"))
{
EditText edit1=(EditText)findViewById(R.id.text1);
Intent intent1 = new Intent(input.this, Two.class); // intent클래스에 a클래스 추가
String input1=edit1.getText().toString();
intent1.putExtra("text1", input1);
startActivity(intent1);// intent시작
}
else
{
EditText edit2=(EditText)findViewById(R.id.text1);
Intent intent2 = new Intent(input.this, Two.class); // intent클래스에 a클래스 추가
String input2=edit2.getText().toString();
intent2.putExtra("text2", input2);
startActivity(intent2);// intent시
}
}
});
}
}




인텐트에 대한 이해가 부족하신것 같아 조금 설명을 먼저 드리자면..
A에서 B 액티비티로 "홍길동" 이라는 값을 전달 할 경우 -
A액티비티에서
Intent intent = new Intent(this, B.class);
intent.putExtra("value1", "홍길동")
startActivity(intent);
B액티비티의 onCreate등에서는 ..
Intent intent = getIntent();
String returnVal = intent.getStrigExtra("value1");
위와같이 데이터를 전달 할 수 있습니다.
이것을 좀 응용해서 startActivityForResult라는 method를 이용하면 A->B 데이터 전달후.. B가 종료되기전 setResult(data)를 선언해주면 A가 다시 화면에 나올 때 B로부터 데이터를 받을 수 있습니다. 즉 데이터가 A->B의 단방향이 아닌 A->B->A 형태로 이동이 되는거죠.. 여기에는 또하나의 규칙이 있는데 다시 A로 돌아올때 받는 최종 데이터는 getIntent()등이 아닌 OnActivitiyResult 라는 콜백 메쏘드를 통해 받을 수 있습니다.
지금 위 소스를 보면 그런 방식이 아닌 Input 액티비티( 보통 안드로이드는 이런경우 클래스라기 보다는 액티비티로 이야기 하시는게 혼동이 덜 합니다.) 에서 putExtra를 이용해 Two 액티비티를 다시 호출해 주고 있습니다. 이런경우 치명적인 오류가 발생하게 됩니다. 다시 호출되는 Two클래스와 처음 시작했던 Two클래스가 메모리상에 다른놈으로 분류되서. 액티비티 스택은 맨 밑서부터 Two - Input - Two 이런식으로 쌓이게 됩니다. 질문자께서 위에서 테스트 하신 방식대로 한다면 Two - > Input -> Two -> Input -> Two 요렇게 각각 다른 창을 띄워 보게 되는 거죠. 플래그 등으로 해결할 수 있는데 이 부분은 액티비티 라이프사이클과 인텐트에 대해 더 학습해 보시기 바랍니다.
결론으로 돌아와서 위의 방식에서 해답을 찾으신다면. 문제는 Two 의 onCreate 안에서..
Intent intent1= getIntent();
String st1 = intent1.getStringExtra("text1");
text1.setText(st1);
Intent intent2= getIntent();
String st2 = intent2.getStringExtra("text2");
text2.setText(st2);
}
위의 부분이 에러입니다. 바로전의 input 에서는 분기에 따라 둘중 하나만 putExtra로 주는데, 첫번째 이미지 클릭이후 다시 돌아올 땐 text1이 값이 있고 text2는 null, 두번째 이미지 클릭시에는 text1이 null, text2가 값이 유요해서 위처럼 되는거겠죠.
어거지로 해결하려면 getIntent()로 받은 데이터를 static 멤버를 이용해 저장해서 null이면 무시하도록 체크하는 방법이 가장 쉬운 법일것같네요.
Intent intent1= getIntent();
String st1 = intent1.getStringExtra("text1");
text1.setText(st1);
위를 ...
if(st1 == null) {
txt1.setText([static값])
} else {
static값 = st1;
txt1.setText([static값]);
}
요런식으로요.