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

아래의 화면을 만드는데 생각보다 쉽지가 않아요..

0 추천

안녕하세요.

예전에 글을 올린적이 있었는데.. 해결하지 못해서ㅏ..

다시 글을 올렸습니다.. 이쯤되면.. 재능이 없는건가 싶기도 하네요ㅠㅠ

 

아래의 사진의 문제를 풀고 있는데 생각보다 쉽게 해결되지 않아서 이렇게 글을 올렸습니다.

디자인 부분에서, 끌어서 버튼들을 배치하는데, 그렇게 하면 잘 안되더라구요.. 분명히 어떤 문법들을 써 주어야 하는거 같은데.. 상대 레이아웃에서 어떤 문법들을 적용해주어야지 아래의 사진과 같은 배치가 나오는지

잘 모르겠습니다 ㅠ ㅠ.. 분명히 디자인부분에서 버튼위젯을 끌어다 쓰는건 원하는것은 아닌것 같고.. 저렇게 예쁘게 배치를 해야 하는데.. 어떻게 해야할지 잘 모르겠어요 ㅠㅠ \

여기저기 찾아봐도, 저 문제에 대한 답을 구하기는 초보자인 저에게 정말

쉽지가 않아서 이쪽에 이렇게 글을 남깁니다 ㅠ

 

Kind카인드 (3,600 포인트) 님이 2016년 10월 8일 질문

2개의 답변

0 추천
 
채택된 답변

자바코드로도 똑같이 가능합니다. 급조한 코드이니 아래코드를 참고하세요.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout container = (RelativeLayout)findViewById(R.id.activity_main);
        setupLayoutAtRuntime(container);
    }

    private void setupLayoutAtRuntime(RelativeLayout container) {
        if (container == null) return;

        Button ofTop = null;
        for (int i=1; i<10; i++) {
            int subject = 0;
            if (ofTop != null)
                subject = ofTop.getId();
            int rule = RelativeLayout.ALIGN_PARENT_LEFT;
            if (i % 3 == 2)
                rule = RelativeLayout.ALIGN_PARENT_RIGHT;
            if (i % 3 == 0)
                rule = RelativeLayout.CENTER_IN_PARENT;
            ofTop = createButton(container, "Button " + i, subject, rule);
        }

    }

    private Button createButton(RelativeLayout container, String caption, int subject, int rule) {
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
        if (subject>0)
            lp.addRule(RelativeLayout.BELOW, subject);
        if (rule>0)
            lp.addRule(rule);
        Button child = new Button(container.getContext());
        child.setId(generateId());
        child.setText(caption);
        child.setLayoutParams(lp);
        container.addView(child);
        return child;
    }

    private int generateId() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            return generateViewId();
        } else {
            return View.generateViewId();
        }
    }

    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

    public static int generateViewId() {
        for (;;) {
            final int result = sNextGeneratedId.get();
            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
            int newValue = result + 1;
            if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
            if (sNextGeneratedId.compareAndSet(result, newValue)) {
                return result;
            }
        }
    }
}

 

spark (227,910 포인트) 님이 2016년 10월 9일 답변
Kind카인드님이 2016년 11월 3일 채택됨
0 추천

아래처럼 하니까 금방 되네요.

<?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"
    android:orientation="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1" />

    <Button
        android:id="@+id/button2"
        android:layout_below="@id/button1"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button2" />

    <Button
        android:id="@+id/button3"
        android:layout_below="@id/button2"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button3" />

    <Button
        android:id="@+id/button4"
        android:layout_below="@id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button4" />

    <Button
        android:id="@+id/button5"
        android:layout_below="@id/button4"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button5" />

    <Button
        android:id="@+id/button6"
        android:layout_below="@id/button5"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button6" />

    <Button
        android:id="@+id/button7"
        android:layout_below="@id/button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button7" />

    <Button
        android:id="@+id/button8"
        android:layout_below="@id/button7"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button8" />

    <Button
        android:id="@+id/button9"
        android:layout_below="@id/button8"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button9" />

</RelativeLayout>

 

spark (227,910 포인트) 님이 2016년 10월 8일 답변
흐어억...
혹시 만드실때, 버튼위젯을 끌어다가 쓰신건가요?
아니면, 위젯에 상관없이 코드로만 짜신건가요?
ㄷㄷㄷ ..
말씀하신것이, 문제에서 말하는 레이아웃의 정렬속성과 위치속성을 이용하신 건가요..?

alignparentright 같은 경우에는, 위치를 말하는것 같고
centerHorizontal은 수평이라는 정렬이라서
그럼 위의 문제에서 요구로 하는것을 둘다 사용하신거맞나요?
이부분떄문에 계속 고민하고있네요 ㅠ ㅠ
아 문제가 코드로만 짜는거였나 보네요. XML로 되면 코드로도 됩니다. 어차피 inflator가 레이아웃을 해석해서 자바코드로 만드는 거니까요. 말씀하신 두가지 속성이 포인트인 것 같습니다.
헉 ㅠ 아니요 아니요 위에 먼저번에 짜주신것처럼 짜는게 맞아요.
xml코드가 아니라, 처음에 답변 달아주신것처럼 위젯부분으로 만드는 것이 맞아요. 그런데, 위젯으로 만드실때, 마우스로 끌어서
문제에서 요구로 하는 속성인 alignparentright와 centerHorizontal의 값을 일일히 주신건가요? 아니면 마우스의 자동완성으로 해결이 된것인가요?
...