getWidth e getHeight restituiscono uno zero

Sto cercando di fare un semplice programma di disegno per l'android.

Ho una class di View personalizzata per gestire il disegno. Quando chiamo la sua getWidth e getHeight metheds, ottengo uno zero.

  • Android: come scalare più viste insieme?
  • Come passare i valori tra i frammenti
  • Come impostare il colore di background dell'indicatore della scheda Visualizza in Android
  • Visualizza getVisibility () isShown () restituisce la visibilità non corretta
  • Android Salva l'object come blob in sqlite
  • Android: get il numero di file all'interno di Zip?
  • Ma il disegno funziona bene, io codice duro in width e altezza in modo che funziona. Perché sta facendo questo?


    La mia class di visualizzazione

     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 } 

    La class Attività

     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 } 

    il file 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> 

  • catturare lo scorrimento per respingere l'evento
  • Animazione nella barra di notifica Visualizzazione personalizzata
  • L'intento in sospeso fa sempre nuove attività
  • Aggiornamento IntelliJ a 10.5 e build di Android fallisce Android SDK non specificato
  • Caricare un vector disegnabile in immagini dalla scheda SD
  • Android Studio segnala la syntax come errore, ma gradle compila
  • 5 Solutions collect form web for “getWidth e getHeight restituiscono uno zero”

    La width e l'altezza non sono definite finché la visualizzazione non viene effettivamente visualizzata sullo schermo.

    Utilizzare void onLayout astratto protetto (boolean changed, int l, int t, int r, int b) (che ignora l'attività) per sapere quando le size sono pronte.

    Complementando la risposta di Mah, ho scoperto che è ansible get i valori dai parametri, come il codice seguente:

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

    La cattura reale è l'utilizzo dei LayoutParams, che hanno ancora regole non elaborate dall'elemento.

    Non sono certo, ma può avere qualcosa a che fare con where il codice è nel ciclo di vita della tua attività. Se stai chiamando getWidth() e getHeight() prima che la vista sia visualizzata sullo schermo, otterrai un valore di 0. Ho avuto anche questo a me.

    Non sono sicuro se c'è un modo per questo. Ho dovuto contare su get la width e l'altezza dell'hardware, invece che la width e l'altezza della vista. Potresti finire per approssimare la width e l'altezza della vista e codificarlo duramente.

    Dovresti call getWidth () e getHeight () nel metodo overlide onLayout .

    La vista ha size solo dopo aver visualizzato per la prima volta.

    Altra cosa:

     int h=getHeight(); h=400; 

    È inutile no? È solo per il test?

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.