Please Enable JavaScript!
Gon[ Enable JavaScript ]

android 특정 위치에 위젯 클릭시 색상 변환

안드로이드 개발
반응형

android 특정 위치에 위젯 클릭시 색상 변환

 

개발환경 : JDK 6.0, android API 2.2, window XP



여러개의 데이타를 표현하고자 할때 행으로 된 리스트를 보여주게 된다.

안드로이드에서는 ArrayAdapter, ListView 를 상속받아 사용자정의 클래스를

만들어 리스트 데이타를 표현하기도 하고, LayoutInflater 객체로 addView

함수를 사용해 미리 정의된 행자체를 추가할수도 있다.

리스트를 만드는 방법은 다양하므로 자기가 편한 방법을 취사 선택하면

될것같다. 여기에서는 위해서 언급한 두가지 경우에 따라 클릭시

색상 변환을 어떻게 처리할지 간단하게 다루도록 한다.

 

첫번째 ListView 를 상속받아 만들었다면 내장함수 setOnItemClickListener

셋팅해서 사용하면 된다. setOnItemClickListener 에 인자로 들어가는

OnItemClickListener 클래스의 onItemClick 함수를 오버라이딩해서 그 내부에

색깔 변경 관련 소스를 집어넣는다.
private class MyListView extends ListView{
       private String[] mStrings = {"1번째", "1번째", "3번째", "4번째"};
               
       public MyListView(Context context){
           super(context);
           listView();
       }
       
       public void listView(){
           setAdapter(new ArrayAdapter (getContext(), android.R.layout.simple_list_item_1, mStrings));
           setTextFilterEnabled(true);
           setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
                   arg1.setBackgroundColor(Color.RED);
               }
           });
       }
   }

두번째는 ArrayAdapter 을 사용해서 색상을 변경하고자 할때이다. ArrayAdapter 에서는

getView 함수내부에 기능을 구현하게 되는데 getView 에서 넘어오는 데이타는

리스트뷰에서 한 행을 의미한다. 한 행 전체의 View 가 넘어오는 것이다.

그래서 한행 전체를 변경하고 싶을때는 두번째 인자로 넘어온 convertView

사용하면 되고 그 행에서 특정 View 의 상태를 변경하고자 할때는

TextView txtVicRank = (TextView) convertView.findViewById(R.id.vic_rank); 식으로

추출해서 사용하면 된다.

일단 View 객체가 있다면 클릭이벤트를 추가해야하는데 그 함수는 setOnTouchListener

이다. 인자로 OnTouchListener 객체를 넘기게 되는데 내부에 onTouch 함수를 구현 하면

된다.

소스를 간략하게 설명하자면 중간에 setOnTouchListener 와 그 내부에 onTouch 가 있다

인자로 넘어오는 MotionEvent 를 통해 어떤 이벤트가 실행되었는지 판단하고

그에 합당한 기능을 집어 넣으면 된다. 소스에서는 클릭다운과 업일때 각각

색상을 달리하는 기능을 넣었다.
private class GameAdapter extends ArrayAdapter {
    private ArrayList items;
    
    public GameAdapter(Context context, int textViewResourceId, ArrayList items) {
    	super(context, textViewResourceId, items);
        this.items = items;
    }
    
    /* (non-Javadoc)
     * @see android.widget.ArrayAdapter#getCount()
     */
    public int getCount() {
        return items.size();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.rigrank_soccer_sub, null);
        }
        
        // 클릭했을때 표현 
        v.setOnTouchListener(new OnTouchListener(){
			public boolean onTouch(View v, MotionEvent event) {
				if(event.getAction() == MotionEvent.ACTION_DOWN) {
					v.setBackgroundColor(0xB6492600);
				}else if(event.getAction() == MotionEvent.ACTION_UP) {
					v.setBackgroundColor(0x00000000); // 원래대로 복귀
				}
				return false;
			}
		});
       
        JSONObject p = items.get(position);
        if (p != null) {
        	TextView txtVicRank = (TextView) v.findViewById(R.id.vic_rank);
           	txtVicRank.setText("rank");
        }
        return v;
    }
}

세번째는 LinearLayout 를 통해서 리스트를 만드는 경우인데 리스트를 표현하는

방식이 틀릴뿐 클릭이벤트 처리부분은 두번째와 동일하다
LinearLayout mList = (LinearLayout)mVi.inflate(R.layout.rigrank_soccer_sub, mGeneral, false);
JSONObject p = mReceiveData.getJSONObject(i);
if (p != null) {
	try {
    	TextView txtVicRank = (TextView) mList.findViewById(R.id.vic_rank);
        TextView txtTeamName = (TextView) mList.findViewById(R.id.team_name);
        String teamNo = p.getString("TEAM_NO");
        txtTeamName.setId(Integer.parseInt(teamNo));
        txtTeamName.setOnClickListener(new OnClickListener() {
			/** 상세화면으로 보낸다 */
            public void onClick(View v) {
            	// 팀번호를 상세화면으로 보낸다
            	LogManager.d(this.getClass().getName(), "Data Number : " + v.getId());
            	Intent intent = new Intent(mContext, TeamInfo.class);
				intent.putExtra("teamNo", String.valueOf(v.getId()));
				startActivity(intent);
            }
        });
        // 클릭했을때 표현 
        txtTeamName.setOnTouchListener(new OnTouchListener(){
			public boolean onTouch(View v, MotionEvent event) {
				if(event.getAction() == MotionEvent.ACTION_DOWN) {
					v.setBackgroundColor(0xB6492600);
				}else if(event.getAction() == MotionEvent.ACTION_UP) {
					v.setBackgroundColor(0x00000000); // 원래대로 복귀
				}
				return false;
			}
		});
        
        
    	
	} catch (JSONException e) {
		e.printStackTrace();
	}
}
mGeneral.addView(mList);

상단에 있는 안드로이드 화면은 클릭시 색상이 변경되는 모습을 캡쳐한 것이다.

그리고 세번째 소스로 구현한 것이다. View 에 보면 setOn 으로 시작하는 함수가

여러개 있다. 이벤트에 대한 구현인데 setOnFocusChangeListener(l),   setOnKeyListener(l)

setOnTouchListener(l) 등이있다. 이름에서도 알수 있듯이 포커스가 갔을때 어떤 키를

눌렸느냐 등인데 이 함수를 사용하면 위젯의 다양한 이벤트를 활용해서

좀더 생동감 있는 어플을 구현할수 있지 않을까?


반응형
Posted by 녹두장군1
,