2014-01-23 154 views
1

我有一個gridview併爲其填充自定義適配器,用戶可以通過我的網格的微調器行和列進行設置。在網格的每個單元格中,我設置了一個視頻視圖。android通過gridview填充所有屏幕

因此,我需要在我的自定義適配器中爲每個視頻視圖設置dinamically以填充屏幕的其餘部分。按照this我可以完成任務,我將顯示大小和佈局設置爲我的視圖除以行數和列數。

問題是主要佈局有動作欄和textview。所以窗戶大小不正確。我需要減去動作欄和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的,並在其上添加兩個隱藏視圖嘗試,一個在頂部角落,另一個在底部角落(例如1dip高度/寬度)。然後,從代碼你可以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 
    } 
} 

編輯:爲了讓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

好吧,但我需要調整videoview,而不是textview ...我怎麼能在innested ongloballayoutlistener做到這一點? – tulkas85

+0

GridView的一些不錯的屬性是它自動調整其子項大小,因此通過設置gridview的大小,內部包含的視頻視圖應相應調整大小。 如果這不能使你想要什麼,你能準確地知道什麼是錯的嗎? –

+0

是的,我希望gridview填充剩餘的整個屏幕。但是,Gridview本身不做這件事,我必須手動設置孩子的佈局,在這種情況下videoviews。如果我設置了 videoView.setLayoutParams(新的GridView.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));在getView方法中, ,視頻未顯示。僅當我爲佈局參數設置固定的寬度和高度時,視頻纔會顯示。如果你可以發佈自動gridview佈局的例子,我將不勝感激 – tulkas85