2012-11-06 2 views
3

먼저이 사이트를 몇 년 동안 읽었으며 여러 번 묶어 두었습니다. 여기에 기여한 커뮤니티에 감사 드리며 잘하면 당신은 내 자신의 문제로 나를 도울 수 있습니다.Java Android : 표시하기 전에 UI 전처리

저는 회사에서 안드로이드 개발을 시작하고 Windows Mobile C#에서 기존 응용 프로그램을 Android Java로 이식하려고 시도하고 있습니다. 그것의 대부분은 순조롭게 진행되고 있지만, 난 어려움을 겪고있는 부분 중 하나가 UI입니다.

Windows Mobile 응용 프로그램은 WinForm을 만들 때 파일에서 측량 사양을 읽습니다. 닫힌 질문 (예 : 객관식)의 경우, 해당 사양의 각 해당 답변에 대해 CheckBox 또는 RadioButton 컨트롤을 화면에 채워야합니다. 필요한 레이아웃과 컨트롤을 만들면 문제는 없지만 화면이 스크롤되지 않아야합니다. 이 때문에 우리의 소프트웨어는 디스플레이되기 전에 오버 플로우 (즉, 디스플레이에 사용 된 1-4 열)없이 사용 가능한 화면 공간 내에서 최상의 적합성을 계산할 수 있어야합니다.

내 UI를 작성했습니다 (적어도 레이아웃)를 XML 리소스 또는 Java 코드로 사용하지만 onCreate()에서 GetWidth() 및 GetHeight()와 같은 메서드가 0을 반환하기 때문에 필자는 아직이 사전 처리를 추가 할 수 없었습니다.

이 모든 것은 화면에 표시되기 전에 발생해야합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있다면, 나는 대단히 감사 할 것입니다.

답변

1

Android가 레이아웃에서 UI를 빌드하면 레이아웃의 루트는 onMeasure()를 호출하여 레이아웃의 모든 자식에게 원하는 크기를보고하도록 요청합니다. 이것은 재귀 패션의 밑바탕입니다. 필요하다면 부모 뷰는 자식의 크기를 설정하여 적합하게 만듭니다. 찾은 것처럼이 측정 패스는 onCreate() 중에 완료되지 않습니다.

전체 레이아웃 수신기를 사용해보십시오.

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is 
    LinearLayout mainLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.main, null); 

    // set a global layout listener which will be called when the layout pass is completed and the view is drawn 
    mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       // measure your views here 
      } 
    } 
); 

setContentView(mainLayout); 
+0

감사합니다. Simon! 지금 측정 값을 읽을 수는 있지만,이 반복을 어떻게 만들 수 있는지는 여전히 확신 할 수 없으므로 적합성을 테스트 할 수 있습니다. 그래서 20 가지 가능한 답을 가진 설문 조사 질문이 있다고 가정 해 봅시다. 내 응용 프로그램은 먼저 해당 내용을 단일 열 목록에 넣으려고합니다. 따라서 응답을로드하고 GlobalLayoutListener에서 측정하여 화면 공간을 오버 플로우시킬 것으로 판단하면 앱을 재설정하고 대신 2 열을 사용하여 다시 표시해야합니다. 일을 더욱 복잡하게 만들려면 답안 텍스트가 싸여있을 수 있으므로 개별 답변의 높이는 정적이지 않습니다. –

+0

필자는 목록을 말하면 RadioButtons 또는 CheckBox로 채워진 LinearLayout을 의미합니다. –

+0

리스트 또는 스크롤 뷰를 사용하는 경우 선형 레이아웃과 내용 만 스크롤되므로 모든 내용의 크기를 조정하여 그 안에 들어갈 수 있도록하는 방법이 있습니다. 그래서 두 가지 질문이 남아 있습니다. 당신은 이미 안드로이드 뷰에 적용하는 방법 - 프로그래밍 방식으로 LayoutParams를 검색하는 방법, 텍스트를 측정하는 방법입니다. 가장 좋은 해결책은 맞춤 클래스를 사용하여 textView를 확장하고 onMeasure() 및 onDraw()를 재정의 한 다음 onDraw()에서 텍스트의 길이를 측정하는 몇 가지 기술. 측정 후에는 requestLayout을 호출하여 부모가 다시 측정해야 하는지를 알게되면 onMeasure()가 다시 호출됩니다. – Simon

관련 문제