2012-06-29 2 views
0

사용자 정의보기를 사용하여 Android 응용 프로그램을 만들고 있습니다. 전에 여러 번 해본 적이 있지만 이번에는 이상한 문제가 발생한 것 같습니다.안드로이드 레이아웃이 레이아웃으로 레이아웃되지 않습니다. 사용자 정의보기가 예상대로

XML 또는 레이아웃 편집기를 통해 레이아웃을 만들려고 할 때 내 사용자 지정보기가 예상대로 레이아웃되지 않습니다. 기존 뷰의 오른쪽에 내 뷰 중 하나를 배치하면 뷰가 왼쪽에 정렬 된 것처럼 보입니다. 나는 무슨 뜻인지 보여주기 위해 이미지를 첨부했습니다. Layout Issue

나는 다른 어떤보기에도 나타나지 않으며, 비슷한 응용 프로그램을 사용 했음에도 불구하고 이전에 어떤 일도 일어나지 않았습니다. 사용자 정의보기 용 코드.

누구도 이와 같은 문제가 발생 했습니까? 그렇다면 어떤 제안입니까?

요청시보기 및 기타 관련 가능성이있는 코드 용 코드를 넣을 수 있습니다.

EDIT - 좋아요, 요청대로 코딩하고, 잘하면 그것은 너무 많은 사람을 기분을 상하게하지 않습니다.

XML :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/relativeLayout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<com.offthemap.sudokusolver.SudokuButton 
    android:id="@+id/sudokuButton2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

<com.offthemap.sudokusolver.SudokuButton 
    android:id="@+id/sudokuButton1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@+id/sudokuButton2" /> 

</RelativeLayout> 

사용자 정의보기 :

package com.offthemap.sudokusolver; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.view.View; 

public class SudokuButton extends View 
{ 
private static Bitmap background, border, borderSelected; 
private static Bitmap[] number; 
private static int size = 100; 
private int numberIndex = -1; 

public SudokuButton(Context context, AttributeSet attrs) 
{ 
    super(context); 
    Resources res = getResources(); 
    if (background == null){background = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.background), size, size, false);} 
    if (border == null){border = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.border), size, size, false);} 
    if (borderSelected == null){borderSelected = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.borderselected), size, size, false);} 
    if (number == null) 
    { 
     number = new Bitmap[]{ 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.one), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.two), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.three), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.four), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.five), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.six), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.seven), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.eight), size, size, false), 
       Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.nine), size, size, false) 
       }; 
     } 
} 

public void increaseNumber() 
{ 
    numberIndex++; 
    if (numberIndex == 9){numberIndex = -1;} 
    invalidate(); 
} 

public void setNumber(int newNumber) 
{ 
    numberIndex = newNumber; 
} 

public static void setSize(int newSize) 
{ 
    size = newSize; 
} 

protected void onDraw(Canvas canvas) 
{ 
    canvas.drawBitmap(background, 0, 0, null); 
    if (numberIndex != -1) 
    { 
     canvas.drawBitmap(number[numberIndex], 0, 0, null); 
    } 
    canvas.drawBitmap(border, 0, 0, null); 
} 

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); 
} 

private int measureWidth(int measureSpec) 
{ 
    int preferred = background.getWidth(); 
    return getMeasurement(measureSpec, preferred); 
    } 

private int measureHeight(int measureSpec) 
{ 
    int preferred = background.getHeight(); 
    return getMeasurement(measureSpec, preferred); 
} 

private int getMeasurement(int measureSpec, int preferred) 
{ 
    int specSize = MeasureSpec.getSize(measureSpec); 
    int measurement = 0; 

    switch(MeasureSpec.getMode(measureSpec)) 
    { 
    case MeasureSpec.EXACTLY: 
     measurement = specSize; 
     break; 
    case MeasureSpec.AT_MOST: 
     measurement = Math.min(preferred, specSize); 
     break; 
    default: 
     measurement = preferred; 
     break; 
    } 
    return measurement; 
} 
} 

SECOND 편집 - 그것을 해결하기 위해 듯, 확실하지 않은 정적 비트 맵을 사용하여이 일어나고 있지만 제거하는 이유와 단지 문제가 있었다 나타납니다 .

+0

xml 콘텐츠가 좋을뿐만 아니라 사용자 정의보기의 코드입니다. – Niko

답변

0

layout_Right_of를 정의한 xml을 게시 할 수 있습니까?

참조 된 뷰 또는 이후에 정의하는 경우 때때로 de + + id 또는 @id가 이미 정의 된 경우이를 사용하는 것이 좋습니다.

- 편집 -

public class SudokuButton extends View 
{ 

사람 :

public class SudokuButton extends RelativeLayout 

과 :

<com.offthemap.sudokusolver.SudokuButton 
android:id="@+id/sudokuButton1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@+id/sudokuButton2" /> 

사람 :

<com.offthemap.sudokusolver.SudokuButton 
android:id="@+id/sudokuButton1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentTop="true" 
android:layout_toRightOf="@id/sudokuButton2" /> 

벡 예 : R의 미리보기 구성 요소에 이미 정의되어 있습니다.

두 가지 주석은 사용자 지정 구성 요소의 상대 또는 선형 레이아웃과 같은 ViewGroup에서 확장 해보십시오. 두 번째 구성 요소는 두 번째 구성 요소에서 첫 번째 구성 요소를 참조 할 수 있습니다. @ + id

감사합니다, Alex.

+0

이클립스 인터페이스는 기본적으로 +를 @ + id에 추가하는 것으로 보이며 과거에는 정상적으로 작동했습니다. 그것을 바꾸면 아무런 효과가없는 것 같습니다. RelativeLayout을 확장하는 목적을 이해하지 못했지만 사용자 정의보기를 만드는 동안 View를 확장하는 것이 더 논리적이지 않습니까? – Aelexe

+0

올바른 방법으로 태그를 사용하는 좋은 습관을 설명하겠습니다. @ + id는 R에 새 ID를 추가하고, Eclipse는 자동으로 de +를 추가합니다. 당신은 당신의 id의 첫 번째 정의에만 +를 넣고, @ id로 그것을 참조한다. GroupView에서 확장하려면 onMeasure와 같은 일부 메서드가 GroupView에서 올바르게 상속되므로 그로부터 확장하는 것이 좋습니다. 작동하는지 확인하십시오. :) – Goofyahead

관련 문제