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

if문 변수 비교연산에 대해서

0 추천

이 소스는 화면의 폭을 구해서 거기에 여러개의 폭이 다른 버튼들을 수직 수평으로 배열 하려고,  인터넷에서 여러개의 예

제 소스들 중 필요한 부분은 합치고 , 수정하는 과정 속에서 문제가 발생해서 질문 드립니다.

if( screenWidth < buttonSizeSum )-----1번

screenWidth 은 리스너 뷰의 화면 Width 값을 받는 변수입니다.

buttonSizeSum 은 배열 되는 버튼들의 Width 값을 합치는 것입니다.

위의 if문의 역할은 화면폭 보다 버튼 폭들의 합이 크면 아래 if문을 돌려서 열을 변경 시키는 것입니다.

그런데 저렇게 하면 무조건 핸드폰에서 실행 시키면 실행이 안되고 팅깁니다.

혹시 변수들이 값을 제대로 못 받아서 그런가 하고 다르게 수식을 변경하면

if( (buttonSizeSum % screenWidth)  == 0 ) ----2번

이런식으로 변경하면 화면에 수직 수평으로 배열이 됩니다. 그래서 값을 못 받는 문제는 아닌 것 같고

if문에 조건식을 제대로 못 만들어서 그런것 같은 데 저렇게 사용 하면 안되는 것인가요

전체 소스를 1번 버전과 2번 버전으로 올리겠습니다.

화면 폭에 맞게 가져온 버튼의 총 길이와 비교해서 화면 폭보다 크면 열을 바꾸게 하는 비교식을 어떻게 작성해야 하는 지

해결 책좀 알려 주세요 머리에 쥐가 나려고 합니다.

1번 코딩 소스 MainActivity.java

public LinearLayout linearLayoutBottom; 
public Button listBtn; 
public static int screenWidth; 
public static int screenHeight; 
public static int buttonSize; 
public static int buttonSizeSum; 
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
        screenHeight = metrics.heightPixels;
       
        linearLayoutBottom = (LinearLayout)findViewById(R.id.linearLayoutBottom);
        linearLayoutBottom.setOrientation(LinearLayout.VERTICAL);
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT );
        LinearLayout rowLayout =null;   
        buttonSizeSum = 0;  
        for (int i = 1; i < 50; i++)   //나중에 디비테이블의 컬럼 수로 대체 할 부분
        {
        /*if( (buttonSizeSum % screenWidth)  == 0 ) */
        if( screenWidth < buttonSizeSum )
            { 
                 rowLayout = new LinearLayout( this ); 
                 linearLayoutBottom.addView( rowLayout, p ); 
                 buttonSizeSum = 0;
            }
       
             listBtn = new Button(this);
             listBtn.setId(R.id.listButton);  
             listBtn.setText(""+ i);
             listBtn.setWidth(50);
             listBtn.setHeight(20);
           
            //listBtn의 폭 값을 가져 온다.
             listBtn.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
          buttonSize = listBtn.getMeasuredWidth();
             buttonSizeSum = buttonSizeSum + buttonSize;
 
             listBtn.setOnClickListener(this);
             rowLayout.addView(listBtn, p);  
        }
    }
public void onClick(View v) { 
 
2번코딩은
파란 부분을 주석 처리 하고 아래 붉은 부분의 주석을 해제하면 됩니다.
 
 

 

만들어보자 (130 포인트) 님이 2014년 9월 26일 질문
만들어보자님이 2014년 9월 26일 수정

2개의 답변

+1 추천

rowLayout이 null 이네요

조건문안에 

rowLayout = new LinearLayout( this ); 

이게 있는데 처음에 진입을 못하니  아래addView할때 널포인터예외가 나겠죠

alkyne (22,960 포인트) 님이 2014년 9월 26일 답변
그럼 어떻게 해야 하나요 수준이 미약 해서 알려 주셨지만 해결책을 모르겠습니다. 밖으로 빼서 돌려 보았는 데도 전보다 더 에러 생기고 해결이 안되네요. 길을 찾을 수 있게 좀더 조언 주세요 ^^
LinearLayout rowLayout =null;

대신에

LinearLayout rowLayout = new LinearLayout( this );
linearLayoutBottom.addView( rowLayout, p );  

라고 해주면 첫 rowLayout이 길을 찾을 수 있겠네요
감사합니다. 알려 주시기 전에 그렇게 해보니 되었습니다. 친절하게 다시 답글 달아 주셔서 정말 감사 드립니다. 이제 다음 단계로 넘어 갈 수 있게 되었습니다. 몇주간 정말 골 머리 썩었었는 데 이제 힘이 나네요 ^^ 다시금 정말 감사 드립니다.
0 추천
onCreate에서 버튼의 크기를 구하면 항상 0이 나옵니다.

UI가 화면에 보여지는 시점에 크기를 구해야 제대로 된 값이 나옵니다.

 

그리고 비정상종료될 때 logcat을 올리셔야 문제 파악에 도움이 됩니다.
익명사용자 님이 2014년 9월 26일 답변
제가 여러가지 테스트 해 본 결과 원하는 형태로 안나와서 그렇지만 출력은 됩니다.
말씀 대로 로그 캣 올립니다. ^^
 340: W/dalvikvm(4068): threadid=1: thread exiting with uncaught exception (group=0x41f4d700)
345: E/AndroidRuntime(4068): FATAL EXCEPTION: main
345: E/AndroidRuntime(4068): java.lang.RuntimeException: Unable to start activity ComponentInfo{kr.co.aaa.bbbapp/kr.co.aaa.bbbapp.MainActivity}: java.lang.NullPointerException
345: E/AndroidRuntime(4068):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
345: E/AndroidRuntime(4068):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2359)
345: E/AndroidRuntime(4068):     at android.app.ActivityThread.access$700(ActivityThread.java:165)
345: E/AndroidRuntime(4068):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326)
345: E/AndroidRuntime(4068):     at android.os.Handler.dispatchMessage(Handler.java:99)
345: E/AndroidRuntime(4068):     at android.os.Looper.loop(Looper.java:176)
345: E/AndroidRuntime(4068):     at android.app.ActivityThread.main(ActivityThread.java:5455)
345: E/AndroidRuntime(4068):     at java.lang.reflect.Method.invokeNative(Native Method)
345: E/AndroidRuntime(4068):     at java.lang.reflect.Method.invoke(Method.java:525)
345: E/AndroidRuntime(4068):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
345: E/AndroidRuntime(4068):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
345: E/AndroidRuntime(4068):     at dalvik.system.NativeStart.main(Native Method)
345: E/AndroidRuntime(4068): Caused by: java.lang.NullPointerException
345: E/AndroidRuntime(4068):     at kr.co.aaa.bbbapp.MainActivity.onCreate(MainActivity.java:109)
345: E/AndroidRuntime(4068):     at android.app.Activity.performCreate(Activity.java:5372)
345: E/AndroidRuntime(4068):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
345: E/AndroidRuntime(4068):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
345: E/AndroidRuntime(4068):     ... 11 more
onCreate에서 버튼의 크기를 구하면 항상 0이 나옵니다.
이런 문제가 있어서 여러곳을 찾아 아래 처럼 하면 된다고 해서
listBtn.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);
buttonSize = listBtn.getMeasuredWidth();
이렇게 구현 하면 수치가 나옵니다.
문제는 이것이 아닌 것 같아 보이네요 ^^
...