2014-01-23 13 views
1

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

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

Проблема в том, что в главном макета есть панель действий и текстовое представление. Таким образом, размер окон неверен. Мне нужно вычесть размер action-bar и textview. я найти решение для размера ноу действий бара, но когда получить высоту моего TextView всегда 0.

Как предполагает here я должен принять TextView размера после рендеринга, но для визуализации моего GridView мне нужно знать этот размер !!

Есть ли другие способы сделать это? Нужно вручную вычислить размер представления?

это мой макет

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    tools:context="it.nexera.visiamobile.ViewLiveMultiActivity" 
    > 

    <TextView 
      android:id="@+id/txt_grid" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="24sp" 
      android:textColor="#454545" 
      android:gravity="left" 
      android:text="@string/sel_grid" /> 

     <Spinner 
      android:id="@+id/grid_spinner" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/gridview" 
      android:layout_toRightOf="@+id/txt_grid" /> 

    <GridView 
     android:id="@+id/gridview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stretchMode="columnWidth" 
     android:layout_below="@+id/txt_grid" 
     android:gravity="center" 
    /> 

</RelativeLayout> 

и это мой метод GetView для заказа адаптера:

// create a new VideoView for each item referenced by the Adapter 
    @SuppressLint("NewApi") 
    public View getView(int position, View convertView, ViewGroup parent) { 
     VideoView videoView; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      videoView = new VideoView(mContext); 
       WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
      Display display = wm.getDefaultDisplay(); 
      int width=0; 
      int height=0; 

      if (android.os.Build.VERSION.SDK_INT >= 13){ 
       Point size = new Point(); 
       display.getSize(size); 
       width = size.x; 
       height = size.y; 
      } 
      else{ 
       width = display.getWidth(); 
       height = display.getHeight(); 

      } 
      // Calculate ActionBar height 
      TypedValue tv = new TypedValue(); 
      int actionBarHeight=0; 
      if (mContext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) 
      { 
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,mContext.getResources().getDisplayMetrics()); 
      } 


      TextView textview = (TextView) ((Activity) mContext).findViewById (it.nexera.visiamobile.R.id.txt_grid); 

      int textview_height=textview.getHeight(); 

      height=height-actionBarHeight-textview_height; 
      AbsListView.LayoutParams param = new AbsListView.LayoutParams(
        (width/COL_NUMBER), 
        (height/ROW_NUMBER)); 
      videoView.setLayoutParams(param); 



      Uri video = Uri.parse(mvideoSrc[position]); 
      videoView.setVideoURI(video); 
      videoView.start(); 

     } else { 
      videoView = (VideoView) convertView; 
     } 

     return videoView; 
    } 
+0

'fill_parent'is устарел, используйте вместо него' match_parent'. –

+0

ОК спасибо, но это не решает мою проблему – tulkas85

ответ

0

Вы пробовали, добавив RelativeLayout под сеткой, и добавив две скрытые взгляды на нее , один в верхнем углу, а другой - в углу подзарядки (например, высота/ширина). Затем из кода вы можете отправить findViewById и позвонить по номеру getLocationOnScreen. Это только первая грязная идея, которая мне пришла в голову. Таким образом, вы можете получить точный размер в пикселях (или dpi) сетки.

1

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

Я думаю, что вам нужно, а не использует ViewTreeObserver, как это:

final View myView = ... // The RelativeLayout that's declared as root of your layout file 
myView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    @Override 
    public void onGlobalLayout() { 
     // You can here use View.getMeasuredWidth() or View.getMeasuredHeight() which correspond to the available space for the view containing your GridView and your TextView and then set your TextView's size 
    } 
} 

Edit: Для того, чтобы сделать GridView заполнить все остальное пространство можно использовать вместо LinearLayout, используя его атрибут вес:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="1" 
    tools:context="it.nexera.visiamobile.ViewLiveMultiActivity" 
    > 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/txt_grid" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="24sp" 
      android:textColor="#454545" 
      android:gravity="left" 
      android:text="@string/sel_grid" /> 

     <Spinner 
      android:id="@+id/grid_spinner" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

    <GridView 
     android:id="@+id/gridview" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:stretchMode="columnWidth" 
     android:gravity="center" 
     android:layout_weight="1" 
    />  
</LinearLayout> 
+0

нормально, но мне нужно изменить размер видео, а не textview ... как я могу сделать это во вложенном ongloballayoutlistener? – tulkas85

+0

Некоторое приятное свойство gridview заключается в том, что он автоматически изменяет размер своих детей, поэтому, задав размер gridview, просмотры видео, содержащиеся внутри, должны быть соответствующим образом изменены. Если это не делает то, что вы хотите, можете ли вы точно определить, что не так? –

+0

Да, я хочу, чтобы gridview заполнил весь экран. Но Gridview сам не делает этого, я должен установить вручную макет для детей, в данном случае видео. Если я установил videoView.setLayoutParams (новые GridView.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); в методе getView, видео не показано. Видео отображается только в том случае, если я устанавливаю фиксированный widht и высоту для параметров макета.Если бы вы могли опубликовать пример автоматической компоновки сетки, я был бы признателен за это. – tulkas85

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