스피너




스피너 값을 특정 값으로 지정하고 싶다면


해당 특정 값의 순서로 지정할 수 있다.


해당스피너변수.setSelection(특정 값 순서);


예를 들면


name 이라는 스피너를 선언했고


스피너 목록에는 


성시경

윤하

태연


이렇게 3개가 있다고 가정하자



그런데 스피너 초기 값을 별도로 지정하지 않으면 성시경으로 될 것이다.


하지만 태연으로 지정해주고 싶다.


그렇다면


name.setSelection(2);


라고 해주면 된다.


항상 시작은 0번째부터 시작이니 태연은 0,1,2 순으로 2번이기 때문이다.


onClick 메소드에 추가해주거나 특정 동작을 할 때 이 코드를 넣어주면 초기 값이 바뀐다.




  1. +요롱이+ 2014.02.03 10:16 신고

    안드로이드 스피너 초기 값 지정하기 너무 잘 알아 갑니다^^


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

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);
      이런식으로 보내시면 됩니다.


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

+ Recent posts