Как получить ширину RelativeLayout, которую я добавил в TableRow в Android

#android #gridview

#Android #gridview

Вопрос:

Я работаю над фрагментом кода, который генерирует представление книжной полки с использованием компонентов TableLayout, HorizontalScrollView и RelativeLayout. У меня есть титульная страница по умолчанию, я должен поместить название книги на обложку и сформировать вид сетки (книжная полка).

Примерно код выглядит так

 bitmapObj = BitmapFactory.decodeResource(getResources(), R.drawable.bookshelf_background_image);
tableLayoutObj = (TableLayout) findViewById(R.id.tblLayout);
tableRowObj = new TableRow(this);
for(int i = 0; i < numberOfRows; i  )
{ 
    horizontalScrollObj = new HorizontalScrollView(this
    for(int j = 0; j < numberOfColumns; j  ) 
{
       relativeLayoutObj =(RelativeLayout) inflaterObj.inflate(R.layout.bookshelf_relative_layout, null);
       tableRowObj.addView(relativeLayoutObj);
    }   
}
  

Что я хотел здесь знать, так это то, что я хотел получить ширину relativelayout, которую я добавляю в TableRob obj, чтобы я мог определить параметр, сколько книг я могу разместить в ряд.

Может ли кто-нибудь помочь мне, пожалуйста, в этом?

Ответ №1:

Существует множество методов, таких как:

  1. view.getLeft();// возвращает левую позицию представления относительно его родительского элемента
  2. view.GetRight();// возвращает правильное положение представления относительно его родительского элемента аналогично сверху и снизу
  3. view.getWidth()
  4. view.getHeight()

Ответ №2:

Вероятно, на момент выполнения вашего кода ваш вид еще не был отрисован, поэтому его ширина и высота равны нулю.

Вы можете использовать view.post(Runnable) и для Runnable получения их ширины и высоты..

Комментарии:

1. он возвращает значение -1 в общедоступном методе void run()

2. вы уверены, что он был добавлен в иерархию представлений?

3. да, после вызова только метода ‘add’ я вызываю, чтобы получить ширину представления

Ответ №3:

Я знаю, что это поздно, но мне самому нужно было что-то вроде вашего вопроса, и я придумал это решение. (он НЕ возвращает 0, я проверил)

 ViewTreeObserver viewTreeObserver = YOURVIEW.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      YOURVIEW.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      viewWidth = YOURVIEW.getWidth();
      viewHeight = YOURVIEW.getHeight();
    }
  });
}
  

Комментарии:

1. да, я пробовал, я работаю на устройстве nexus, ширина устройства равна 1080, но относительная ширина макета, которую я получаю, равна 0 (нулю)

2. вы установили вес в 0 в xml?

3. Нет. Это мой XML-файл для относительной компоновки <?xml version=»1.0″ encoding=»utf-8″?> <RelativeLayout xmlns:android=» schemas.android.com/apk/res/android » android:id=»@ id/root_relative_layout_id» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android:background=»#0000FF»>

4. и у него есть 2 дочерних элемента. один из них — вид изображения, а другой — текстовый вид/>

5. текстовое представление5dp» android: paddingRight=»5dp» android: paddingTop=»5dp» android: singleLine =»false» android: textColor =»#000000″ android:TextStyle =»bold» />