2013-10-28 3 views
20

Я TextView создан программно, так:Android получить программно созданного вида по

   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(); 

Но mTextView.getWidth() всегда возвращает 0

И если я стараюсь:

mTextView.getLayoutParams().width 

Он возвращает соответствующее значение LayoutParams в классе LayoutParams (-1 или -2)

Как я могу получить ширину представления?

EDIT мне нужно сделать это здесь:

  @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 РЕШЕНИЕ Я использовал это от @ androiduser отвечают:

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

Проблема решена!

+1

Вы не можете получить ширину зрения, пока 'onMeasure' был призван на представлении. См. Http://stackoverflow.com/q/3591784/827110 –

+0

Теперь, если вы сообщите нам, для чего вам нужна ширина? Возможно, кто-то может предложить решение. –

+0

Вы вызываете getWidth() слишком рано. Пользовательский интерфейс еще не был отмерен и выложен на экране. –

ответ

15

Я использовал это решение:

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

Как бы вы это назвали? Я просто добавляю width = mTextView.getWidth(), но не работает. – Pumpkin

+2

Проверьте это, возможно, у вас что-то не хватает: http://www.sherif.mobi/2013/01/how-to-get-widthheight-of-of- view.html –

+0

Спасибо за ссылку! – Pumpkin

2

Эти значения являются постоянными значениями для FILL_PARENT и WRAP_CONTENT. Если вы хотите, чтобы проверить размер просмотра вы можете попробовать этот способ:

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

вы должны ждать, пока андроид не обращает TextView. Таким образом, вы отправляете Runnable в очереди tagMap, которая выполняется, надеюсь, после рисования текста (так что это должен быть вес и высота).

+0

Не работает, похоже, не работает – Pumpkin

+0

Что значит «не работает»? – Blackbelt

+0

Мне нужно получить ширину сразу после добавления представления в tagMap, но я этого не понимаю, когда я делаю тост, это все равно 0 – Pumpkin

0

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

В OnCreate своей деятельности в mehotd поставить это:

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

    } 
}); 
+0

Правильно и быстрее меня. :) – Enrichman

+0

Мне нужно сделать это в onPostExecute() – Pumpkin

1

В этом методе вы можете получить высоту ширину зрения ..

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

и TextView mTextView глобальный

3

получить таким образом:

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

Кажется, что не работает, мне нужно что-то добавить? – Pumpkin

Смежные вопросы