이미지


스피너를 이용하여 값을 전달한 후 값에 따른 이미지를 출력하였다.

string.xml에 스피너에 쓰일 목록을 만들어둔다.



<string name="season">시즌</string>
    
    <string name="season_prompt">시즌 선택</string>
    <string-array name="season_array">
        <item>봄</item>
        <item>여름</item>
        <item>가을</item>
        <item>겨울</item>
    </string-array>



그 다음 send.xml



 <Spinner 
         android:id="@+id/spinner_season" <!--스피너 아이디-->
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:prompt="@string/season_prompt"<!-- string.xml에서 작성한 목록 -->
         android:layout_marginRight="10dp"
          />




이렇게 스피너를 만들어준다.



그리고 SendActivity.java 에서 스피너 값을  보내주자 OnCreate 부분에


Spinner spinner = (Spinner)findViewById(R.id.spinner_season);//send.xml의 스피너 아이디
		
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.season_array,
				android.R.layout.simple_spinner_item);
		
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinner.setAdapter(adapter);



이렇게 스피너를 선언해주고 Onclick메소드에 스피너 값을 인텐트에 태워 보낸다.


String str_season = spinner.getSelectedItem().toString();	
	 	
 Intent it3 = new Intent(this,ReceiveActivity.class);
			 
	 
			 
 it3.putExtra("it3_season", str_season);	//it3_season 이라는 스트링으로 str_season 값을 넘긴다.	 
 
startActivity(it3);





이제 스피너 값에 따른 이미지를 출력하기 위해 receive.xml 에

이미지 뷰를 만들었다


  <ImageView
       android:id="@+id/season_year"
       		
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"     
                      
       />




이제 ReceiveActivity.java 에서 받아보자.

마찬가지로 OnCreate 부분에



Intent it3=getIntent();		//인텐트를 받아오고
		
		String str_season= it3.getStringExtra("it3_season"); //it3_season으로 보내온 값을 str_season에 저장
		
		ImageView season = (ImageView)findViewById(R.id.season_year); //사진을 출력할 이미지뷰
		if(str_season.equals("봄")){ //str_season 값이 봄이라면
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.spring); //봄 사진 가져와서
			season.setImageDrawable(img_season);//봄 사진 출력
		}else if(str_season.equals("여름")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.summer);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("겨울")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.autumn);
			season.setImageDrawable(img_season);
		}else if(str_season.equals("가을")){
			BitmapDrawable img_season = (BitmapDrawable)getResources().getDrawable(R.drawable.winter);
			season.setImageDrawable(img_season);
		}



여기서 애를 먹었던게 if 값을 그냥 평소 하던대로

if(str_season == "봄") 이런식으로 해줬는데 안되서 찾아보니까 String 값은

str_season.equals("봄")  

이런식으로 해줘야 했다.


이제 스피너로 봄 값이 넘어오면 이미지뷰에 봄 사진을 넣어주고 여름이면 여름사진을 보여준다.

아 소스코드 태그 은근 귀찮네..






  1. 뿌잉뿌잉 2013.10.26 22:35 신고

    Intent it3 = new Intent(this,ReceiveActivity.class); 에서 오류가 생겨서 this를 getApplicationContext()로 바꿔줬는데요
    소스창에서 에러가 뜨지는 안는데 시뮬레이션에서 에러가뜨네요 ㅜㅜ this를 바꿔준게 문제일까요??ㅜㅜ

    • yonoo88 2013.10.26 23:54 신고

      오류 메세지가 어떤건지 알려주실 수 있나요? 도움이 된다면 드리고 싶네요

  2. 으악 2013.11.09 09:07 신고

    저는 this를 sendActivity.this 로 바꾸고 실행시켰더니 OnClick 메소드에서 오류가 뜨네요ㅠㅠ
    OnItemClicked로도 바꿔봤는데 spinner 와 같이 쓸수 없다는 에러가 떠요ㅜㅜ 그부분도 코드 올려주실수 있나요?

    • yonoo88 2013.11.09 00:12 신고

      글대로 해도 오류가 났나요? 혹시 로그캣 에러메시지를 알려주실 수 있나요? 저는 딱 위 글처럼 했거든요.

    • 으악 2013.11.09 01:33 신고

      java.lang.RuntimeException: Unable to start activity componentInfo: java.lang.RuntimeException:Don't call setOnClickListener for an adapterView. 이렇게 떠요ㅜㅜ

    • yonoo88 2013.11.09 01:49 신고

      저 로그캣메시지만 나오나요? 전체 메시지를 봤으면 해서요

      로그캣 메시지 중 아랫쪽 부분에 프로젝트내 액티비티와 소스 몇번째 코드인지 나와있는 부분이나 널 포인트 에러메시지가 있다면 더 문제알기가 쉬울꺼 같습니다.

      혹시나 참고가 되는 글이 있나요?
      검색 링크 입니다.
      https://www.google.co.kr/search?q=Don't+call+setOnClickListener+for+an+adapterView&oq=Don't+call+setOnClickListener+for+an+adapterView&aqs=chrome..69i57&sourceid=chrome&espv=210&es_sm=122&ie=UTF-8#es_sm=122&espv=210&newwindow=1&q=Don't+call+setOnClickListener+for+an+adapterView&tbas=0

    • 으악 2013.11.09 09:08 신고

      11-08 23:57:19.334: E/dalvikvm(752): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
      11-08 23:57:58.653: E/AndroidRuntime(752): FATAL EXCEPTION: main
      11-08 23:57:58.653: E/AndroidRuntime(752): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itm.android/com.itm.android.Fragment02}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.view.View.performClick(View.java:3511)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.view.View$PerformClick.run(View.java:14105)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Handler.handleCallback(Handler.java:605)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Handler.dispatchMessage(Handler.java:92)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.os.Looper.loop(Looper.java:137)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.main(ActivityThread.java:4424)
      11-08 23:57:58.653: E/AndroidRuntime(752): at java.lang.reflect.Method.invokeNative(Native Method)
      11-08 23:57:58.653: E/AndroidRuntime(752): at java.lang.reflect.Method.invoke(Method.java:511)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
      11-08 23:57:58.653: E/AndroidRuntime(752): at dalvik.system.NativeStart.main(Native Method)
      11-08 23:57:58.653: E/AndroidRuntime(752): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.widget.AdapterView.setOnClickListener(AdapterView.java:761)
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.Activity.performCreate(Activity.java:4465)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
      11-08 23:57:58.653: E/AndroidRuntime(752): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
      11-08 23:57:58.653: E/AndroidRuntime(752): ... 18 more
      11-09 00:03:04.966: E/AndroidRuntime(800): FATAL EXCEPTION: main
      11-09 00:03:04.966: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itm.android/com.itm.android.Fragment02}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.view.View.performClick(View.java:3511)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.view.View$PerformClick.run(View.java:14105)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Handler.handleCallback(Handler.java:605)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Handler.dispatchMessage(Handler.java:92)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.os.Looper.loop(Looper.java:137)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.main(ActivityThread.java:4424)
      11-09 00:03:04.966: E/AndroidRuntime(800): at java.lang.reflect.Method.invokeNative(Native Method)
      11-09 00:03:04.966: E/AndroidRuntime(800): at java.lang.reflect.Method.invoke(Method.java:511)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
      11-09 00:03:04.966: E/AndroidRuntime(800): at dalvik.system.NativeStart.main(Native Method)
      11-09 00:03:04.966: E/AndroidRuntime(800): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.widget.AdapterView.setOnClickListener(AdapterView.java:761)
      11-09 00:03:04.966: E/AndroidRuntime(800): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.Activity.performCreate(Activity.java:4465)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
      11-09 00:03:04.966: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
      11-09 00:03:04.966: E/AndroidRuntime(800): ... 18 more

    • yonoo88 2013.11.09 12:53 신고

      저도 아직 초보라 도움이 되실련지 모르겠지만
      로그캣에서
      11-08 23:57:58.653: E/AndroidRuntime(752): at com.itm.android.Fragment02.onCreate(Fragment02.java:65)
      이부분이 있는데 65번째 줄 소스코드가 어떻게 되나요?

      초반에 스피너 호출하는 부분인거같은데

      Spinner spinner = (Spinner)findViewById(R.id.spinner_season);//send.xml의 스피너 아이디

      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.season_array,
      android.R.layout.simple_spinner_item);

      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      spinner.setAdapter(adapter);

      이 소스코드 부분이 아닐까 생각해봅니다.
      그리고 스피너로 어떤 기능을 만드시는 건가요

  3. 안녕하세요^^ 2013.12.19 16:18 신고

    질문이있습니다!
    스피너를 2개 이상 쓸 때는 인텐트를 어떻게 해야하나요? 여러번 시도해봤는데 어떻게 하는건지 모르겠네요ㅠㅠ
    예를 들어 시즌뿐만 아니라 스포츠 사진을 스피너를 통해 더 넣고 싶다던지.. 한데 둘다 어떻게 하면 넘길 수 있을까요ㅠ

    • yonoo88 2013.12.20 00:05 신고

      인텐트는 하나만 쓰시면 되고

      스포츠사진을 넘겨줄 값을 하나 더 만드시면됩니다.

      위 예제에서는
      it3.putExtra("it3_season", str_season);
      이런식으로 시즌 값을 보냈따면

      스포츠사진에 사용할 스피너를 하나 더 만드시고
      it3.putExtra("it3_sportsImg", str_sportsImg);
      이런식으로 보내시면 됩니다.


      인텐트는 장바구니 같은거라고 보시면됩니다.
      그 안에 스피너 값, 텍스트 값 등등이 들어가는거죠


이미지를 캡쳐해서 저장한 후 공유하기를 통해 이미지를 공유하고 싶었다.

이 공유하기 기능을 사용하면 카톡 페북 미투데이 등등 메뉴가 저절로 나온다.신기방기


                         Intent intentSend  = new Intent(Intent.ACTION_SEND);

 intentSend.setType("image/*");

 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(파일경로));

 startActivity(Intent.createChooser(intentSend, "공유"));

특정파일을 공유하기 위해 다음과 같이 사용했다.

공유하기 버튼을 만들어 그 안에 집어넣었다.

Intent it3=getIntent(); //파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

String str_name=it3.getStringExtra("it3_name"); //이름을 가져온다.

File fileRoute = null;

fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

    

if(files.exists()==true)  //파일유무확인

{

Intent intentSend  = new Intent(Intent.ACTION_SEND);

intentSend.setType("image/*");


//이름으로 저장된 파일의 경로를 넣어서 공유하기

intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));


startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

}else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

}


소스양식버전


Intent it3=getIntent();	//파일명을 가져오기 위한 인텐트(에디트텍스트에서 이름입력받은 걸 파일명으로 쓰기 위해)

	String str_name=it3.getStringExtra("it3_name");	//이름을 가져온다.	

	File fileRoute = null;

	fileRoute = Environment.getExternalStorageDirectory(); //sdcard 파일경로 선언

			

        File files = new File(fileRoute,"/temp/"+str_name+"-.jpeg"); //temp폴더에 이름으로 저장된 jpeg파일 경로 선언

		     

	 if(files.exists()==true)  //파일유무확인

	 {

			 Intent intentSend  = new Intent(Intent.ACTION_SEND);

			 intentSend.setType("image/*");



//이름으로 저장된 파일의 경로를 넣어서 공유하기

			 intentSend.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileRoute+"/temp/"+str_name+"-.jpeg"));



			 startActivity(Intent.createChooser(intentSend, "공유")); //공유하기 창 띄우기

		 }else{

//파일이 없다면 저장을 해달라는 토스트메세지를 띄운다.

			 Toast.makeText(getApplicationContext(), "저장을 먼저 해주세요", Toast.LENGTH_LONG).show();

		 }





  1. 초보 2014.03.18 11:37 신고

    안녕하세요 유용한 팁 잘 보았습니다 그런데 리스트를 띄우지 않고 바로 카카오톡이나 페이스북으로 공유를 보낼 수 있는 방법이 있을까요?

    • yonoo88 2014.03.18 21:48 신고

      음 그 부분은 저도 한번 살펴봐야겠네요..

    • 초보 2014.03.19 15:38 신고

      방법을 찾으신다면 댓글로 간략하게라도 답변을 부탁드립니다 ㅠㅠ아니면 리스트중에 카카오톡/페이스북 같이 지정된 앱만 출력하는 방법은 있을까요?

    • yonoo88 2014.03.19 16:12 신고

      http://www.kakao.com/services/api/kakao_link

      여기 한번 보시면 될려나요

      사용예로

      // KakaoTalk으로 바로 보내시려면 아래 코드를 추가합니다.
      intent.setPackage("com.kakao.talk");

      이러한 코드가 있네요.


      http://dev.epiloum.net/916

      여기 링크도 참고해보셔요

    • 초보 2014.03.24 11:08 신고

      오 감사합니다 ㅠㅠ

  2. ㅎㅇ 2016.08.22 14:25 신고

    지금 fileRoute = Environment.getExternalStorageDirectory(); 이부분이 Required java.io.File Found java.lang.String 이렇게 빨간색으로 뜨고
    Intent it3=getIntent(); 이부분에서 getintent 이부분이 cannot resolve symbol getIntent 이렇게 뜨는데 제가 지금 어뎁터 안에 있는 onClick 안에 지정을 해서 오류가 나는건가요?

    • yonoo88 2016.08.22 18:13 신고

      저도 잘 보진 못하지만 코드를 봐봐야 알 것 같네요..




내가 참고한 블로그. 


http://theeye.pe.kr/entry/example-of-image-crop-with-camera-and-album-picker-on-android?category=18



트랙백은 뭐하는건지 모르겠다..

누가 알려주실 분..


그리고 위 소스는 정사각형으로 밖에 자르기가 안되는데 직사각형으로도 자르게 하려면


case PICK_FROM_CAMERA: { // 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다. // 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다. Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageCaptureUri, "image/*"); intent.putExtra("outputX", 120); intent.putExtra("outputY", 130); intent.putExtra("aspectX", 1); //이걸 삭제한다 intent.putExtra("aspectY", 1); //이걸 삭제한다 intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_FROM_CAMERA); break; }


이 2개를 지워주면 자유자재로 자르기가 가능하다.
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
 X Y 좌표가 1:1 비율로 고정됐기 때문에 정사각형으로만 자르기가 되었던 것이었따. 




+ Recent posts