안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요
바코드 스캔 관련된 어플을 만들어 보려고 막 자바를 잡은 초보입니다.
아래와 같은 소스를 찾아서 이용해보려 하고 있습니다.
그런데 위에 빨간 바탕으로 써진 result.getContents() 의 값을 다음의 다른 보이드 함수 내의 파란 바탕 부분 result.getContents()으로 가져와 이용하고 싶습니다.
하지만 파란 부분에 오류가 발생하며 상위의 빨간 부분과 연동이 되지 않습니다.
다른 함수 내에 들어있으므로 연결이 안되는 것은 이해가 가는데 이 둘을 이을 방법을 모르겠습니다.
검색을 많이 해 보았는데 static, public 등 int 값과 관련된 내용만 찾을 수 있었습니다. ㅠ
어떻게 하면 이 둘을 이어서 파란 부분이 빨간 부분의 값과 동일하게 될 수 있도록 만들 수 있을까요?
(첫 질문글입니다. 공지 읽었습니다.)
///////////////////////////////
죄송합니다. 소스 코드 부분에는 색상이 들어가질 않네요 ㅠ 글 쓸때는 잘 보이는데...
그래서 /////////////////////////////////////////////// 처럼 주석처리로 나타냈습니다.
위의 주석처리 다음 줄에 있는 result.getContents() 를 가져와서 아래의 주석처리 다음 줄에 있는 것처럼 이용하고 싶습니다.
//////////////////////////////
아래는 소스 코드입니다.
public class Add_barcode extends Activity {
private Long mRowId; private NotesDbAdapter mDbHelper; private static final int ACTIVITY_EDIT = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
mDbHelper = new NotesDbAdapter(this); mDbHelper.open();
mRowId = (savedInstanceState == null) ? null
: (Long) savedInstanceState
.getSerializable(NotesDbAdapter.KEY_ROWID);
if (mRowId == null) {
Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
: null;
}
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
IntentIntegrator.initiateScan(Add_barcode.this);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode,
resultCode, data);
new AlertDialog.Builder(this)
.setTitle(R.string.app_name)
.setMessage(
////////////////////////////////////////////////////////////////////////////////////////////////////////////
result.getContents() + " [" + result.getFormatName() + "]")
.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
}).show();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveState();
outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
}
@Override
protected void onPause() {
super.onPause();
saveState();
}
private void saveState() {
String title = ""; String body = ""; String main_id = "";
//////////////////////////////////////////////////////////////////////////////////////////// String barcode = result.getContents();
mDbHelper.updateBarcode(mRowId, title, body, main_id, barcode);
}
}




말씀하신
onActivityResult() 메서드 안의 result 변수는 지역변수 입니다.즉,
onActivityResult() 메서드가 시작되면서 생성되는 변수이지만 해당 메서드가 종료되면 메모리에서 삭제되므로,onActivityResult() 메서드 내에서만 정상적으로 접근이 가능합니다.saveState() 메서드내에서 result 변수를 사용하려면 우선, 해당 변수가 선언되지 않았기 때문에 에러가 발생되며,변수를 선언하더라도saveState() 메서드의 지역변수로 선언되기 때문에onActivityResult() 메서드의 result 변수와는전혀 다른 변수로 취급됩니다.해결 방법은 간단합니다.onActivityResult() 메서드의 result 변수를 메서드 변수(지역 변수)가 아닌 클래스 변수로 선언하시면 됩니다.onActivityResult() 밖에(즉, Add_barcode클래스 안에) result 변수를 선언하면Add_barcode 클래스에 포함된모든 메서드에서 해당 변수에 접근할 수 있습니다.private IntentResult result;
그리고
onActivityResult() 메서드에서는 클래스 변수인 result에 해당 값을 저장합니다.result = ...;saveState() 메서드에서는 저장된 값을 이용하면 됩니다. 이 때 result 값이 null 일 경우 예외가 발생할 수 있으니항상 사용하기 전에는 null 여부를 먼저 체크하시고 사용하시길 권장합니다.