2016-08-31 5 views
0

私はこれについていくつかの記事を読んでいますが、問題を理解することはできません。私は、2つの列に6タイルのGridViewをスクロールする必要がないように、デバイスの画面に正確に合わせようとしています。だから私は、画面サイズのマイナスアクションバーの高さマイナス垂直スペースとして各タイルの高さを計算してみてくださいGridViewを画面に正確に合わせる

Desired screen

:それはどのように見えるかこれ。これは、タイルの高さを計算するために私のコードです:その後、私のGridViewAdapterに、私はgetViewメソッド内の各タイルの高さを設定

public static int getTileHeight(int numOfRows, int verticalSpacing, Context context) { 
    TypedValue tv = new TypedValue(); 
    int actionBarHeight = 0; 
    if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 
     actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); 
    } 

    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int height = displaymetrics.heightPixels; 

    int px = Math.round((numOfRows - 1) * verticalSpacing * (context.getResources().getDisplayMetrics().xdpi/DisplayMetrics.DENSITY_DEFAULT)); 
    return ((height - actionBarHeight - px)/numOfRows); 
} 

垂直方向の間隔は

gridView.getVerticalSpacing() 

によって取得されます。

picture.getLayoutParams().height = getTileHeight(...); 

ここでpictureは画像が入ったImageViewです。

しかし、GridViewの高さは常に画面には少し大きすぎます。私は画面の高さに完全に一致することはできません。私の欠点は何ですか?

+0

xmlを共有できますか? – Shaishav

+1

あなたは常にちょうど6アイテムありますか?もしそうなら、おそらく 'GridView'が最良の選択ではなく、代わりに' layout_weight'と等しい 'LinearLayout'sを使うべきです。 – Karakuri

答えて

0

これを試すことができますか?アクションバーのサイズを2倍にしなければならないようです。

編集:あなたが上部と下部の間隔をしたい場合は

public static int getTileHeight(int numOfRows, int verticalSpacing, Context context) { 
    TypedValue tv = new TypedValue(); 
    int actionBarHeight = 0; 
    if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 
     actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); 
    } 
    int statusBarHeight = 0; 
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); 
    } 

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int height = size.y - actionBarHeight - statusBarHeight; // removed *2 for action bar height and added status bar height 
    int totalSpacing = verticalSpacing*(numOfRows+1); 

    return ((height - totalSpacing)/numOfRows); 
} 

このコードは、あなたの高さを与えます。私はいつも6枚のタイルを持っているので、上部と下部の間隔なしyoutは私がのLinearLayoutにGridViewコントロールを変更からくりさんのコメントに

+0

いいえ、これは動作しません。コードを使用すると、タイルが小さすぎるため、下部に空きスペースがあります。 –

+0

今すぐお試しいただけますか?コードを編集し、ステータスバーの高さを追加し、アクションバーの高さを* 2にしました。私は今すぐこのコードを試して、それは動作しているようだ。 – PampaZiya

+0

これは以前よりも優れていますが、底部にはまだ約2mmの空白があります(HTC Oneデバイス上)。 –

0

感謝をタイルの高さを与える総間隔でnumberOfRows-1を使用して信じています。私は今、このxmlを使用しています:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight=".333"> 
    <include android:id="@+id/burnt_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
    <include android:id="@+id/meal_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
</LinearLayout> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight=".333"> 
    <include android:id="@+id/peace_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
    <include android:id="@+id/sin_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
</LinearLayout> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight=".333"> 
    <include android:id="@+id/trespass_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
    <include android:id="@+id/overview_tile" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight=".5" 
     layout="@layout/tile"/> 
</LinearLayout> 
</LinearLayout> 

これは、すべてのタイルを私が望むように整列させます。 @ Karakuri:ありがとう!

関連する問題