마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음성인식 데이터를 fragment에 전달하는 방법 질문드립니다. 도와주세요 ㅠㅠ

0 추천

가계부 어플을 만들고 있는데요, 음성인식을 통해서 지출, 수입 내역을 입력하고 싶습니다.

입력 액티비티안에 expense cash, earning acsh, expense account, earning account 4개의 프래그먼트를 나눠놓아서 각 버튼을 누르면 그 프래그먼트 화면이 뜹니다. 입력 액티비티 안에는 구글API를 불러오는 음성인식 버튼이 있고, 그 결과값을 프레그먼트의 cost, explanation에 입력되게 하고 싶습니다.

문제는 제가 음성인식 버튼을 눌러 인식한 값이 프래그먼트의 cost, explanation 칸에  입력되지 않는 다는 것입니다. 여러 방법을 사용해 보았으나 입력이 되질 않아서 여기 질문을 올립니다.

코드는 

다음이 inputactivity입니다. 이 액티비티 안에 프래그먼트레이아웃이 존재합니다.

public class InputActivity extends FragmentActivity implements OnClickListener {
	private final int GOOGLE_STT = 1000;
	final String TAG = "InputActivity";
	int mCurrentFragmentIndex;
	private ArrayList<String> mResult;									//음성인식 결과 저장할 list;
	private TextView mResultTextView01;
	private TextView mResultTextView02;
	public final static int FRAGMENT_ONE = 0;
	public final static int FRAGMENT_TWO = 1;
	public final static int FRAGMENT_THREE = 2;
	public final static int FRAGMENT_FOUR = 3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_input);
		Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
		Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
		Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
		Button bt_fourFragment = (Button) findViewById(R.id.bt_fourFragment);
		Button bt_voice = (Button) findViewById(R.id.bt_Voice);	
		bt_oneFragment.setOnClickListener(this);
		bt_twoFragment.setOnClickListener(this);
		bt_threeFragment.setOnClickListener(this);
		bt_fourFragment.setOnClickListener(this);
		bt_voice.setOnClickListener(this);
	    mResultTextView01 = (EditText)findViewById(R.id.cost);
        mResultTextView02 = (EditText)findViewById(R.id.explanation);
		mCurrentFragmentIndex = FRAGMENT_ONE;
		fragmentReplace(mCurrentFragmentIndex);
		
	}

	//ExpenseCashFragment f = (ExpenseCashFragment)getSupportFragmentManager().findFragmentById(R.id.display_fragment);
	
	public void fragmentReplace(int reqNewFragmentIndex) {

		Fragment newFragment = null;
		newFragment = getFragment(reqNewFragmentIndex);

		// replace fragment
	    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

		transaction.replace(R.id.display_fragment, newFragment);

		// Commit the transaction
		transaction.commit();

	}

	private Fragment getFragment(int idx) {
		Fragment newFragment = null;

		switch (idx) {
		case FRAGMENT_ONE:
			newFragment = new ExpenseCashFragment();
			break;
		case FRAGMENT_TWO:
			newFragment = new ExpenseAccountFragment();
			break;
		case FRAGMENT_THREE:
			newFragment = new EarningCashFragment();
			break;
		case FRAGMENT_FOUR:
			newFragment = new EarningAccountFragment();
			break;
		
		default:
			Log.d(TAG, "Unhandle case");
		
		}

		return newFragment;
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {

		case R.id.bt_oneFragment:
			mCurrentFragmentIndex = FRAGMENT_ONE;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_twoFragment:
			mCurrentFragmentIndex = FRAGMENT_TWO;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_threeFragment:
			mCurrentFragmentIndex = FRAGMENT_THREE;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_fourFragment:
			mCurrentFragmentIndex = FRAGMENT_FOUR;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_Voice:
			Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);			//intent 생성
			i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());	//음성인식을 호출한 패키지
			i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");							//음성인식 언어 설정
			i.putExtra(RecognizerIntent.EXTRA_PROMPT, "말을 하세요.");						
			startActivityForResult(i, GOOGLE_STT);	
			break;
		default:
		}
	}


	protected void onActivityResult(int requestCode, int resultCode, Intent data){
		Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.display_fragment);
		fragment.onActivityResult(requestCode, resultCode, data);{
		if( resultCode == RESULT_OK ){		//결과가 있으면
			showResult(requestCode, data);				//결과를 출력.
		}
		else{															//결과가 없으면 에러 메시지 출력
			String msg = null;
			//activity에서 넘어오는 오류 코드를 분류
			switch(resultCode){
				case SpeechRecognizer.ERROR_AUDIO:
					msg = "오디오 입력 중 오류가 발생했습니다.";
					break;
				case SpeechRecognizer.ERROR_CLIENT:
					msg = "단말에서 오류가 발생했습니다.";
					break;
				case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
					msg = "권한이 없습니다.";
					break;
				case SpeechRecognizer.ERROR_NETWORK:
				case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
					msg = "네트워크 오류가 발생했습니다.";
					break;
				case SpeechRecognizer.ERROR_NO_MATCH:
					msg = "일치하는 항목이 없습니다.";
					break;
				case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
					msg = "음성인식 서비스가 과부하 되었습니다.";
					break;
				case SpeechRecognizer.ERROR_SERVER:
					msg = "서버에서 오류가 발생했습니다.";
					break;
				case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
					msg = "입력이 없습니다.";
					break;
			}
			
			if(msg != null)		//오류 메시지가 null이 아니면 메시지 출력
				Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
		}
		
		}
	}	
		private void showResult(int requestCode, Intent data){
		String key = "";
		if(requestCode == GOOGLE_STT)			
			key = RecognizerIntent.EXTRA_RESULTS;

		mResult = data.getStringArrayListExtra(key);
		String[] result = new String[mResult.size()];
		mResult.toArray(result);//	list 배열로 변환
		String i = result[0];
		String[] count = i.split(" ");
		mResultTextView01.setText(""+count[0]);
		mResultTextView02.setText(""+count[1]);
    }
	}

프레그먼트에 onactivityresult 로 액티비티 값을 상속을 받으라고 하여서 이것을 넣어봤으나 되질 않습니다. 솔직히 말해서 매커니즘과 그 방법을 잘 모르겠습니다. 고수님들의 답변 부탁드립니다. ㅠㅠ

김지홍 (120 포인트) 님이 2014년 11월 23일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...