2013-10-28 14 views
20

ho TextView creato a livello di codice, così:Android di vista ottenere a livello di codice creato

   TextView mTextView = new TextView(getApplicationContext()); 

       final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
       ((MarginLayoutParams) params).setMargins(8, 8, 0, 0); 

       mTextView.setText(mText); 
       mTextView.setLayoutParams(params); 
       mTextView.setPadding(2, 2, 2, 2); 
       mTextView.setBackground(getResources().getDrawable(R.drawable.note_corps)); 

       tagMap.addView(mTextView); 

       textViewsWidth = mTextView.getWidth(); 

Ma mTextView.getWidth() restituisce sempre 0

E se provo:

mTextView.getLayoutParams().width 

Restituisce il valore corrispondente di LayoutParams nella classe LayoutParams (-1 o -2)

Come posso ottenere la larghezza della vista?

EDIT ho bisogno di fare questo qui:

  @Override 
     public void onPostExecute(Hashtable<String, Integer> hash){ 
      final ScrollView tagMapScroll = (ScrollView) findViewById(R.id.tagMapScroll); 
      final LinearLayout tagMap = (LinearLayout) findViewById(R.id.tagMap); 
      final ArrayList<Integer> arr = new ArrayList<Integer>(hash.values()); 
      final Enumeration<String> e = hash.keys(); 
      int index = 0; 
      int textViewsWidth = 0; 

      while(e.hasMoreElements()){ 
       final TextView tV = new TextView(getApplicationContext()); 

       tV.setTextColor(Color.parseColor("#666666")); 
       tV.setText(Html.fromHtml(randomColor() + e.nextElement())); 
       tV.setTextSize(arr.get(index)); 

       final LayoutParams params = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
       ((MarginLayoutParams) params).setMargins(8, 8, 0, 0); 

       tV.setLayoutParams(params); 
       tV.setPadding(2, 2, 2, 2); 
       tV.setBackground(getResources().getDrawable(R.drawable.note_corps)); 

       tagMap.addView(tV); 

       textViewsWidth += tV.getWidth(); 

       index++; 
      } 

      tagMapScroll.setVisibility(ScrollView.VISIBLE); 

     } 

EDIT SOLUZIONE ho usato questo da @ di androiduser risposta:

mTextView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 
       int width = mTextView.getMeasuredWidth(); 
       int height = mTextView.getMeasuredHeight(); 

Problema risolto!

+1

Non è possibile ottenere la larghezza della vista, fino alla 'onMeasure' è stato chiamato per la vista. Fare riferimento: http://stackoverflow.com/q/3591784/827110 –

+0

Ora se ci dici di cosa hai bisogno per la larghezza? Forse qualcuno può proporre una soluzione. –

+0

Stai chiamando getWidth() troppo presto. L'interfaccia utente non è stata ancora dimensionata e visualizzata sullo schermo. –

risposta

15

Ho usato questa soluzione:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

    @Override 
    public void onGlobalLayout() { 
     // Ensure you call it only once 
     yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

     // Here you can get the size :) 
    } 
}); 
+0

Come lo chiameresti? Aggiungo semplicemente width = mTextView.getWidth() ma non funziona – Pumpkin

+2

Controlla questo, potrebbe essere che ti manca qualcosa: http://www.sherif.mobi/2013/01/how-to-get-widthheight-of- view.html –

+0

Grazie per il collegamento! – Pumpkin

2

questi valori sono valori costanti per FILL_PARENT e WRAP_CONTENT. Se si desidera controllare le dimensioni di visualizzazione si può provare in questo modo:

tagMap.addView(mTextView); 
tagMap.post(new Runnable() { 
        @Override 
        public void run() { 
         mTextView. getWidth(); 
        } 
       }); 

bisogna aspettare fino a quando Android attira l'TextView. In questo modo stai postando un Runnable nella coda tagMap, che viene eseguito, si spera dopo aver disegnato la textview (quindi dovrebbe essere peso e altezza)

+0

Non funziona, non sembra funzionare – Pumpkin

+0

cosa significa "non funziona"? – Blackbelt

+0

Ho bisogno di ottenere la larghezza subito dopo aver aggiunto la vista a tagMap, ma non capisco, quando faccio un brindisi è ancora 0 – Pumpkin

0

Devi usare la classe ViewTreeObserver che viene utilizzata per registrare gli ascoltatori che possono essere notificato di cambiamenti globali nell'albero della vista. Tali eventi globali includono, ma non sono limitati a, il layout dell'intero albero, l'inizio della passata di disegno, il cambio della modalità tocco.

Nel onCreate del Activity mehotd mettere questo:

ViewTreeObserver vto = mTextView.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     mTextView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     int viewWidth = mTextView.getMeasuredWidth(); 

    } 
}); 
+0

corretto e più veloce di me. :) – Enrichman

+0

Ho bisogno di farlo in onPostExecute() – Pumpkin

1

In questo metodo è possibile ottenere l'altezza larghezza della vista ..

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    int width = mTextView.getWidth(); 
    int height = mTextView.getHeight(); 
} 

e definiscono TextView mTextView come globale

3

ottenere in questo modo:

tV.post(new Runnable() { 
        @Override 
        public void run() { 
         int width=tV.getMeasuredWidth(); 
        } 
       }); 
+0

Non sembra funzionare, devo aggiungere qualcosa? – Pumpkin

Problemi correlati