Подтвердить что ты не робот

GetWidth и getHeight возвращают нуль

Я пытаюсь сделать простую программу рисования для андроида.

У меня есть собственный View класс для обработки чертежа. Когда я вызываю его теги getWidth и getHeight, я получаю нуль.

Но рисунок работает отлично, я жестко кодирую по ширине и высоте, чтобы он работал. Почему он это делает?


Класс My View

public class cDrawing extends View{

    char BitMap[];
    static final short WIDTH=160;
    static final short HEIGHT=440;
    static final char EMPTY=' ';
    int mWidthSize;
    int mHeightSize;

    static final char RED ='R';
    int y;

    public cDrawing(Context context) {
        super(context);

        y=3;
        // set up our bitmap
        BitMap=new char[WIDTH*HEIGHT];
        for(int i=0; i<WIDTH*HEIGHT; i++)
                BitMap[i]=EMPTY;


        // returns zero why???????
        int h=getHeight();
        h=400;
        int w=getWidth();
        w=320;
        mWidthSize=w/WIDTH;
        mHeightSize=h/HEIGHT;


        // TODO Auto-generated constructor stub
    }

Класс активности

public class cCanves extends Activity  implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.canves);
        cDrawing board=new cDrawing(this);


        LinearLayout layout = (LinearLayout)findViewById(R.id.parent2);
        layout.addView(board);


        // set up buttons
        View mEraser = findViewById(R.id.buteraser);
        mEraser.setOnClickListener(this);

        View mBlack = findViewById(R.id.butblack);
        mBlack.setOnClickListener(this);

        View mWhite = findViewById(R.id.butwhite);
        mWhite.setOnClickListener(this);

        View mRed = findViewById(R.id.butred);
        mRed.setOnClickListener(this);

    } // end function

    public void onClick(View v) {
        Intent i;
        switch(v.getId())
        {
        case R.id.buteraser:
            break;
        case R.id.butblack:
            break;
        case R.id.butwhite:
            break;
        case R.id.butred:
            break;
        } // end switch

    }   // function
}

xml файл

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

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:orientation="horizontal"
      android:layout_height="wrap_content">

    <ImageButton android:id="@+id/buteraser"
      android:src="@drawable/icon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/butblack"
      android:src="@drawable/icon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/butwhite"
      android:src="@drawable/icon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>

    <ImageButton android:id="@+id/butred"
      android:src="@drawable/icon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"/>
    </LinearLayout>

    <LinearLayout android:id="@+id/parent2"
      android:layout_width="fill_parent"
      android:orientation="vertical"
      android:layout_height="fill_parent">
    </LinearLayout>


</LinearLayout>
4b9b3361

Ответ 1

Ширина и высота не определены до тех пор, пока изображение не будет фактически отображено на экране.

Использовать protected abstract void onLayout (boolean changed, int l, int t, int r, int b) (которые вы переопределяете в своей деятельности), чтобы знать, когда размеры готовы.

Ответ 2

Дополняя Mah ответ, я узнал, что вы можете получить значения из параметров, например, код ниже:

ImageView imageProcess = (ImageView) li.inflate(
    R.layout.andamento_sinistro_imageprocess, centerLayout, false);
imageProcess.setBackgroundResource(
    (isActive)?(R.drawable.shape_processon):(R.drawable.shape_processoff));
RelativeLayout.LayoutParams imageProcessParams = 
    (RelativeLayout.LayoutParams)imageProcess.getLayoutParams();
imageProcessParams.leftMargin = 
    (int) (centerPosition - 0.5*imageProcessParams.width);
imageProcessParams.addRule(RelativeLayout.CENTER_VERTICAL);
centerLayout.addView(imageProcess);

Настоящий улов здесь - использование LayoutParams, у которых есть правила, еще не обработанные элементом.

Ответ 3

Я не уверен, но это может иметь какое-то отношение к тому, где код находится в lifecycle вашей деятельности. Если вы вызываете getWidth() и getHeight() до того, как на экране отобразится представление, вы получите значение 0. Я тоже это случилось со мной.

Я не уверен, есть ли способ обойти это. Я должен был полагаться на получение ширины и высоты экрана оборудования, а не ширины и высоты представления. Возможно, вам придется приблизиться к ширине и высоте вашего вида и жесткому кодированию.

Ответ 4

Вы должны называть getWidth() и getHeight() в переопределенном методе onLayout.

Ответ 5

В представлении отображаются только размеры после первого отображения.

Другое:

int h=getHeight();
h=400;

Бесполезно нет? Это просто для тестирования?