0

カスタム ビューを使用して Android アプリケーションを作成しています。これまで何度もこれを行ってきましたが、今回は奇妙な問題に遭遇したようです。

XML またはレイアウト エディターを使用してレイアウトを作成しようとすると、カスタム ビューが期待どおりにレイアウトされません。ビューの 1 つを既存のビューの右側に配置すると、左に揃えて表示されます。私が何を意味するかを示すために画像を添付しました レイアウトの問題

他のビューでは発生していないようで、カスタム ビューに同様のコードを使用しているにもかかわらず、以前のアプリケーションでは発生したことがありません。

以前にこのような問題に遭遇した人はいますか? もしそうなら、何か提案はありますか?

リクエストがあれば、ビューのコードやその他の潜在的に関連するコードを掲載できます。

編集 - 申し分なく、要求どおりにコーディングします。うまくいけば、誰もあまり気分を害しません。

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;
}
}

2番目の編集 - 静的ビットマップの使用に問題があったようですが、なぜそれが起こったのかはわかりませんが、削除すると修正されたようです。

4

1 に答える 1

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 のプレビュー コンポーネントで既に定義されているためです。

2 つのコメント、カスタム コンポーネントで Relative または Linear Layout のような ViewGroup から拡張してみてください。もう 1 つのことは、@+id なしで 2 番目のコンポーネントから最初のコンポーネントを参照できることです。

よろしく、アレックス。

于 2012-06-29T09:49:13.407 に答える