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

킷캣에서 동적 뷰 (addView)가 안됩니다. 하위버전에서는 잘되다가 킷캣에서 동작을 안합니다.

0 추천
    public void InsertKeyword(String keyword,int type) {
        if (DBManager.sharedDB().countKeyword >= 5 && type==1) {
            Toast.makeText(getActivity().getApplicationContext(),"등록할 수 있는 키워드 수("+Integer.toString(DBManager.sharedDB().countKeyword)+")를 초과하였습니다.", Toast.LENGTH_SHORT).show();
        } else if (keyword.length() > 50) {
            Toast.makeText(getActivity().getApplicationContext(), "키워드가 최대길이(" + Integer.toString(keyword.length()) + "/50)를 초과하였습니다.", Toast.LENGTH_SHORT).show();
        }
        else if(keyword.length() ==0) {
        }else {

            tableRow = new TableRow(getActivity().getApplicationContext());
            tableRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.MATCH_PARENT
            ));
            CheckBox checkBox = new CheckBox(getActivity().getApplicationContext());
            checkBox.setHeight(TableRow.LayoutParams.MATCH_PARENT);
            checkBox.setWidth(TableRow.LayoutParams.MATCH_PARENT);
            checkBox.setTextColor(Color.DKGRAY);
            checkBox.setTextSize(15);
            checkBox.setOnLongClickListener(this);

            checkBox.setText(keyword);
            if(type==1) {
                DBManager.sharedDB().Savekeyword(keyword);
            }

            this.keyword.setText("");
            tableRow.addView(checkBox);
            tableLayout.addView(tableRow);

        }
    }

하위버전 스마트폰에서는 잘 실행이 되는데 kikkat에서만 동작을 하지않습니다.

정확히는 모든 코드를 잘 훑고 지나가는데 화면에 뷰가 추가되어있지않습니다.

에러가 나는것도 아니라서 이유를 모르겠습니다.

 

키워드를 입력받으면 tableLayout에 CheckBox를 생성해서 키워드로 setText하고

TableRow에 checkBox를 addView하고

CheckBox가 포함 된 TableRow를 다시 TalbeLayout에 addview 하고있습니다.

xml에 테이블로추가하고 체크박스 넣으면 잘 만 보이는데. 왜 동적으로 추가하면 보이지않는걸까요..

같은 코드(어플)로 하위버전 스마트폰에서는  코드수정없이 잘됩니다.

Lunestar (680 포인트) 님이 2015년 2월 26일 질문

1개의 답변

+1 추천
 
채택된 답변
몇가지 눈에 띄는 것이 있긴 하네요.

1, 뷰의 setLayoutParam()에 들어가는 LayoutParam 타입은 그 뷰의 container의 LayoutParams 타입이어야 합니다.

따라서 위 예에서 TableRow에 대한 setLayoutParam할 타입은 TableRow.LayoutParam이 아니라 TableLayout.LayoutParam 입니다.

2. View를 생성할 때 파라미터로 넘기는 context는 그 뷰가 들어갈 activity 컨텍스트여야 할 겁니다. 위 예에서는 getActivity().getApplicationContext()를 사용했는데, 그냥 getActivity()로 전달하는 것이 맞을 듯합니다.

3. 뷰의 dimension을 바꿀 때에는 setLayoutParam을 이용하세요.

위 예에서는 checkBox의 setWIdth()/setHeight()를 불렀는데, 이를 checkBox.setLayoutParam()으로 변경해야 합니다. 1번에서도 언급했듯이 타입은 checkBox의 container인 TableRow.LayoutParams 타입인 것을 유의하세요.

그리고 setWIdth()/setHeight()는 MATCH_PARENT같은 레이아웃 dimension이 아닌 pixel 값을 받습니다.
레오나 (3,290 포인트) 님이 2015년 2월 26일 답변
Lunestar님이 2015년 2월 26일 채택됨
감사합니다ㅎㅎ
setWIdth()/setHeight() 부분을 지웠더니 정상 작동 되었습니다.
알려주신것과 같이 크기를 지정할때는 pixel값을 넣도록 하겠습니다
정말 감사합니다!
...