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

개발초보가 기능 분리하려는데 잘 안됩니다

0 추천

지금 굉장히 소스가 지저분해서 감당이 안되는데 지금부터 추가흐는 기능이라도 분리하려고 합니다.

MainActivity에 쓰일 함수를 만들려고 하거든요

 

그래서 MainComp.java 파일을 만들었습니다.

 

이안에 기능을 구성해서 메인액티비티에서 쓰고 싶은데

딱 이부분을 따로 구성하고 싶습니다.

ImageView country = (ImageView)findViewById(R.id.country_img); //국기이미지
		if(str_national.equals("대한민국")){
			BitmapDrawable img_country = (BitmapDrawable)getResources().getDrawable(R.drawable.korea);
			country.setImageDrawable(img_country);
		}

 



public class MainComp {
	
	
	
	
	Spinner country;
	public void country(ImageView country, String str_national){
		country = (ImageView)findViewById(R.id.country_img); //국기이미지
		if(str_national.equals("대한민국")){
			BitmapDrawable img_country = (BitmapDrawable)getResources().getDrawable(R.drawable.korea);
			country.setImageDrawable(img_country);
		}
	}

이렇게 떼어놨는데 findViewById 여기와 getResources여기서 에러가 나고 있어요

 

각각

 

The method findViewById(int) is undefined for the type FaceonComp

 

The method getResources() is undefined for the type FaceonComp

 

이렇게 에러가 나고있는데 정의를 어떻게 해줘야하죠?

 

메인액티비티에서는 그냥 잘되가지고 어떻게 해야할지 모르곘습니다.

브루스웨인 (8,580 포인트) 님이 2013년 12월 5일 질문

4개의 답변

0 추천
findviewbyid 이건 액티비티에서 가능해요..그래서 만드신 Maincomp클래스의 country 메서드 인자로 액티비를 넘겨서 액티비티.find~~를 하시던가 아니면 액티비티에서 이미지뷰를 만드신(findviewbyid) 후 country 메서드로 전달하세요.
젤바른스 (300 포인트) 님이 2013년 12월 5일 답변
0 추천

서브 쓰레드에선 UI업데이트 권한이 없어요.. 그래서 생기는 문제 입니다. ㅋ.ㅋ 

 country.setImageDrawable(img_country);

이부분을 메인쓰레드에서 실행되도록 수정하시면 됩니다..

서브에서 메인으로 접근하는 방법은... 여러가지가 있습니다. 펍에도 이런 질문은과 답변은 많으니 서브쓰레드 에서 UI수정방법으로 검색해보시길 바랍니다.

익명사용자 님이 2013년 12월 5일 답변
0 추천

코딩스타일에 답은 없습니다만..

제가 볼때 님께서 하려고 하시는 방법은 그닥 좋지 않을거 같아요.

클래스를 분리하신것은 좋은 방법이긴 합니다만..

메인Activity에서 UI조작을 해주시는게 훨씬 좋을거에요.

지금 하시려는 방법으로 본다면 엑티비티에서 ImageView를 생성하고 레퍼런스변수를 MainComp클래스의 country메서드로 넘겨서 거기서 이미지뷰의 이미지교체 작업이 이루어지는데요.

이 이미지 교체작업 자체가 UI 변경 작업이거든요.

이런 UI변경 작업은 왠만하면 Activity단에서 해주는게 더 좋긴해요.

리스트뷰를 구현해서 어댑터에서 각각의 뷰들마다 스크롤될때마다 동적으로 바뀌어야하는 작업이 아니라면,

위의 방법보다는 제 개인적인 의견으로는

public class MainComp { //기능분리 클래스
 
    //입력된 값에 의거하여 해당되는 Drawable객체를 얻는다.
    public static BitmapDrawable getCountryBitmapDrawble(Context context, String str_national){
         BitmapDrawable img_country = null;
             if(str_national.equals("대한민국")){
                img_country = (BitmapDrawable)getResources().getDrawable(R.drawable.korea);
        }
              return img_country; 
    }
 
 
MainActivity.java //UI단 메인 클래스
 
ImageView country = (ImageView)findViewById(R.id.country_img);
BitmapDrawable bitDrawable = MainComp.getCountryBitmapDrawble(MainActivity.this, "대한민국"); //BitmapDrawable 을 얻어온다.
country.setImageDrawable(bitDrawable); //세팅한다.
 
이렇게가 더 낫지 않을까 싶어요.
 
그리고 왠만하면 UI단에서 UI 갱신관련 작업을 하시라고 말씀드리는건
만약 님이 지금 하시려고 하신것처럼 다른 클래스 메서드에서 UI갱신 작업을 하게끔 설계를 하고 만들어 놓았는데
만약 님께서 나중에 해당 메서드를 UI단이 아닌 다른 쓰레드 내에서 쓰게 되면 Exception이 발생하게 됩니다.
그땐 또 거기에 땜빵으로 Handler처리를 해줘야되구요.
갸아악 (21,260 포인트) 님이 2013년 12월 5일 답변
갸아악님이 2013년 12월 5일 수정
위의 static을 쓰셔도 되고, 아니면 싱글톤 방식으로 구성 하셔도 됩니다.
이런식으로 하나하나 기능별로 분리하고 클래스별로 모아놓고 패키지에 담아놓고 하다보면 님만의 라이브러리가 만들어지는거에요. 화이팅힘내셈
앞으로 한 100개 국가가 더 추가될 건데 그럼

BitmapDrawable bitDrawable = MainComp.getCountryBitmapDrawble(MainActivity.this, "일본");
country.setImageDrawable(bitDrawable); //세팅한다.

BitmapDrawable bitDrawable = MainComp.getCountryBitmapDrawble(MainActivity.this, "중국");
country.setImageDrawable(bitDrawable); //세팅한다.


이런식으로 되겠군요.  조언감사합니다.
데이터가 많이 저장되면 SQLite를 사용하시고,
반복작업에는 배열이나 리스트를 사용하시면 편리합니다.
현재 보시면 국가가 상수형태로 존재하는데
저기 전달되는 값이 꼭 상수형태가 아니라면
굳이 위와같은 반복작업이 아닌 한줄로 해결이 되실거에요.
조언감사합니다. 그런데 궁금한게 DB를 사용하면 DB에 이미지를 넣어두는건가요? DB해본게 mysql에서 select comment from board where id=1 뭐 이런식인데 DB에서 문자열과 이미지를 연관시키는 걸 고민해봐야겠네요.. 사용자가 국가명을 입력하면 이미지를 받아오는데 그러면 select img from country where name='국가명' 이런식인가요
전에 학교 후배중에 비슷한 고민하는걸 본적이 있었습니다.
저또한 전에 님같은 고민을 해본 경험이 있구요.
DB에는 파일 또는 이미지를 저장하는것은 적합하지 않습니다.
예를들면 my-sql 같은 경우에는 이미지를 통째로 DB에 저장하는것이 아닌 각각 이미지의 URL주소만 DB에서 가지고 있고 실제 접근하여 스트림을 통하여 다운로드 받거나 하는건 DB가 아닌 클라이언트 로직에서 처리합니다.
즉 DB에서는 숫자나 문자열로 된 기본형 데이터만 저장하고 가지고 있는것이 바람직합니다.

한줄 요약하면 DB에 이미지를 넣어두는것이 아닌 해당 이미지의 URL 주소를 넣어두는것입니다.
만약 국가명에 따라 이미지를 받아야한다면 DB테이블 컬럼에는 대략
id     country     img_path   이런식으로 구성이 되겠지요.
국가명을 검색하면 where절을 사용하여 국가명을 찾아내고 해당 레코드의 img_path를 얻어와 얻어온 img_path를 통하여 이미지를 다운받아서 표시 하시면 됩니다.
아 감사합니다. 그럼 일단 국가 테이블부터 만들어야겠군요.
컬럼구성부터 잘 생각해봐야겠네요.

국기이미지는 어플 drawable-hdpi 폴더에 넣을예정이니 패스는 이쪽으로 하면 되겠군요
0 추천
context 를 넘겨서 context.getResources 이런식으로 하면 되지 않나요??
왈라뽕다 (1,170 포인트) 님이 2013년 12월 11일 답변
...