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

동적으로 레이아웃에 View를 추가하고싶습니다 ㅠㅠ

0 추천

어플 이제 갓 공부시작하며 개발해보려 노력중인 학생입니다 !

 

만들고 싶은 메뉴가 DB에서 정보를 가져와서 저장된 만큼 메뉴 상태바를 만들고싶은? 계획인데 

우선 공부하는 겸 테스트로 for loop으로 그 갯수만큼 view를 추가해보려 하는데 

아마도 addview 에서 문제가 생기는것같아 질문드립니다,

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:id="@+id/relativeLayout">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="@string/숫자입력"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:id="@+id/num"
        android:layout_toStartOf="@+id/click_btn"
      />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/num"
            android:layout_alignParentEnd="true"
            android:layout_alignTop="@+id/num"
            android:id="@+id/click_btn"
            android:text="@string/click"
            android:onClick="onClick"
            />


    </RelativeLayout>


    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:id="@+id/yo"
        android:hint="you entered the number"/>
</RelativeLayout>

 

java 코드입니다,

package com.example.lg.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;

/**
 * Created by LG on 2015-01-20.
 */
public class MenuActiviy extends Activity {

    String nums;
    EditText test1;

    Button bts;
    RelativeLayout rel;


    @Override
    public void onCreate(Bundle savedInstanceSate) {
        super.onCreate(savedInstanceSate);
        setContentView(R.layout.activity_menu);
        test1 = (EditText) findViewById(R.id.num);
        bts = (Button) findViewById(R.id.button_btn);


    }


    public void onClick(View view) {
        EditText test2 = (EditText) findViewById(R.id.yo);
        nums = test1.getText().toString();
        int i;
        rel = (RelativeLayout) findViewById(R.id.rela);

        for (i = 0; i < 5; i++) {

            rel.addView(test2,50,50);
            test2.setText("you entered :" + nums+"   "+i);


        }
    }
}

이렇게 되면 

제가 입력한 숫자와 함께 1,2,3,4 순으로

you entered nms + 1

you entered nms + 2

           쭉쭉 밑으로 내려가는걸 계획했으나... 그냥 앱이 죽어버리더라구요.. 

 addview 를 어떻게 써야하는지 도저히 모르겠습니다 ㅠㅠ

레이아웃에 view 를 추가하려면 어떤 원리인가요., ? 우선 제가 한거는 구글링하면서 짜집기 해본 흉측한코드인지라.

조언좀 부탁드립니다 !!

BooGalee (250 포인트) 님이 2015년 1월 22일 질문

1개의 답변

0 추천
 
채택된 답변
일단 저렇게 하면 안됩니다.ㅎㅎ

동적으로 어떤 View 를 생성해서 붙일 때는, xml에 정의해 놓은 걸 가져다 쓰는 것이 아니구요

일반적으로 xml 에는 동적으로 View를 붙일 자리만 지정해 놓고 (예를 들어 LinearLayout을 Container로 사용)

추가할 View는 java 소스에서 new 로 생성합니다.

EditText 라면, EditText test1 = new EditText(this); 이런 식으로요.

그리고 test1 에 id나 기타 속성값을 지정해 주고, Container에 addView 하는 것이죠.

객체의 동적 생성이나 추가는 실무에서도 자주 쓰이는 것이니 좀 더 공부해 보시면 좋을 거에요~
가랑비 (10,530 포인트) 님이 2015년 1월 23일 답변
BooGalee님이 2015년 1월 23일 채택됨
감사합니다 !! 큰 방향을 잡을 수 있는 답변을 해주셨어요 ㅠㅠㅎㅎ

죄송하지만 하나만 더 여쭤보고싶습니다 !

addview 레퍼런스를 봐도 잘 이해가 안가서 말이죠.. ㅎㅎ

그렇다면 위의 코드 중에서 마지막에
1.

rel.addView(test2,50,50);

에서 () 안에 들어가야할 속성들이 어떤것이어야 하는건가요 ?
2.
xml에 동적으로 view를 붙일 자리를 RelativeLayout을 해도 무관한가요 ?
1. addView 의 파라미터는 여러가지가 들어갈 수 있네요~
레퍼런스 문서나 이클립스에서도 확인 가능합니다. (Ctrl+Space)
단순히 뷰를 추가만 할거면 rel.addView(test2); 만 하고
크기도 함께 지정하려면 rel.addView(test2,50,50); 이렇게..
보니까 생성자가 5개 이니, 사용하려는 의도에 맞게 선택하면 될 것 같아요.
2. RelativeLayout을 사용해도 똑같습니다.
표현하려는 의도에 맞는 걸 쓰시면 되겠죠~~
감사합니다 ^^ !!!
하.. 한가지만 더 질문해드려도 될까요... ^^;;

    public void onClick(View view) {
        int i;
        EditText test2 = new EditText(this);
        nums = test1.getText().toString();
        rel=(LinearLayout)findViewById(R.id.rela);
        i = Integer.parseInt(nums);


            test2.setId(i);
            test2.setText("you entered :" + nums);
            rel.addView(test2);



    }

위와 같이 코드를 변경했는데 클릭이벤트 처리후 아무 변화가 없습니다... ;;
id는 그냥 setid 로 id를 부여해야한다길래 아무 값넣어본것이고

그냥 클릭하면 뷰 하나만 제발 떠주길 바라는데 어디가 문제인걸까요 ㅠㅠ
일단 rel=(LinearLayout)findViewById(R.id.rela); 부분은
클릭할 때 실행할 필요는 없을 것 같으니 onCreate 같은 곳으로 빼는 게 좋을 같고...
xml 에 LinearLayout 을 어떻게 정의해 놓았는지도 확인이 필요할 것 같습니다.
혹시나 화면에 꽉차게 해 놓았는지.. orientation 속성이라던지..
아 그리고 동적 생성하는 EditText의 크기도 지정하는 것이 좋을 것 같네요.
혹시나 기본값 지정 안하면 width-0, height-0 일지도 모르니까요.ㅎ
...